繁体   English   中英

C ++ Struct无效使用非静态数据成员

[英]C++ Struct invalid use of non-static data member

我收到有关无效使用非静态成员以及结构成员无法正常工作的其他问题的错误,我无法理解问题所在,谢谢。

#include <iostream>
#include <string>
using namespace std;


struct classroom {
int RoomNumber;
int NumberOfChairs;
int NumberOfStudents;
int ListOfStudents[NumberOfStudents];
string LectureName;
bool Window, Projector, Available;
}classroom;




int main() {

cout << "Please enter your room number" << endl;
cin >> classroom.RoomNumber;
cout << "Enter the name of the Lecture" << endl;
cin >> classroom.LectureName;
cout << "Enter  number of students" << endl;
cin >> classroom.NumberOfStudents;
cout << "Enter " << classroom.NumberOfStudents <<  " Student Names" << endl;
cin >> classroom.ListOfStudents;
cout << "Enter number of chairs" << endl;
cin >> classroom.NumberOfChairs;
cout << "Are there any Windows? (Y/N)" << endl;
cin >> classroom.Window;
cout << "Are there any Projectors? (Y/N)" << endl;
cin >> classroom.Projector;
cout << "Are there any Available? (Y/N)" << endl;
cin >> classroom.Available;

    return 0;
}

失误

prog.cpp:10:5: error: invalid use of non-static data member ‘classroom::NumberOfStudents’
 int NumberOfStudents;
     ^
prog.cpp:11:20: error: from this location
 int ListOfStudents[NumberOfStudents];
                    ^
prog.cpp: In function ‘int main()’:
prog.cpp:28:18: error: ‘struct classroom’ has no member named ‘ListOfStudents’
 cin >> classroom.ListOfStudents;
                  ^

除非NumberOfStudents的类型为const int否则不能声明数组int ListOfStudents[NumberOfStudents]的数组。 如果它是变量(即不是const ),则编译器不知道如何为数组分配空间。 因此,只需更改int NumberOfStudents; const int NumberOfStudents; 但是,当您执行此操作时,您的结构也将期望NumberOfStudents是静态的,因此您实际上需要编写static const int NumberOfStudents;

在这一点上,您将无法进行cin >> classroom.NumberOfStudents ,并且事情变得非常难看。 我假设这不是您想要的。

如果您确实想要一个可变大小的数组,那么执行此操作的标准方法是使用堆分配。 换句话说,您需要声明ListOfStudents是一个指向整数数组的指针,该整数数组将在运行时分配。

也就是说,您要按以下方式更改结构:

struct classroom {
int RoomNumber;
int NumberOfChairs;
int NumberOfStudents;
int* ListOfStudents;
string LectureName;
bool Window, Projector, Available;
}classroom;

然后在您的main函数中(或实际上在您喜欢的任何地方),您需要调用new来分配一些空间。 像这样:

classroom.ListOfStudents = new int[classroom.NumberOfStudents];

最后一点:这样做,您还需要更改cin >> classroom.ListOfStudents; 循环,将所有值读入数组。 像这样:

for (int i=0; i < classroom.NumberOfStudents; i++) {
  cin >> classroom.ListOfStudents[i];
}

正如其他答案所建议的那样,更改变量classroom的名称以使其与结构名称不匹配也是一个好主意。 但是,它仍然应该可以正常编译(我已经对其进行了测试)。 只是有点混乱。

C ++不支持VLA(可变长度数组),因此您不应使用ListOfStudents [NumberOfStudents]。 改用const

编辑:

prog.cpp:28:18: error: ‘struct classroom’ has no member named ‘ListOfStudents’
 cin >> classroom.ListOfStudents;

此错误表明没有&int类型匹配的运算符>>。 您可能需要循环并打印数组的每个元素。

您可以通过在函数中创建局部变量来做到这一点(尽管不建议使用全局变量):

struct classroom {
    int RoomNumber;
    int NumberOfChairs;
    int NumberOfStudents;
    int ListOfStudents[NumberOfStudents];
    string LectureName;
    bool Window, Projector, Available;
};

int main(){
    classroom myClassRoom;

    cout << "Please enter your room number" << endl;
    cin >> myClassRoom.RoomNumber;
    cout << "Enter the name of the Lecture" << endl;
    cin >> myClassRoom.LectureName;
    cout << "Enter  number of students" << endl;
    cin >> myClassRoom.NumberOfStudents;
    cout << "Enter " << myClassRoom.NumberOfStudents <<  " Student Names" << endl;
    cin >> myClassRoom.ListOfStudents;
    cout << "Enter number of chairs" << endl;
    cin >> myClassRoom.NumberOfChairs;
    cout << "Are there any Windows? (Y/N)" << endl;
    cin >> myClassRoom.Window;
    cout << "Are there any Projectors? (Y/N)" << endl;
    cin >> myClassRoom.Projector;
    cout << "Are there any Available? (Y/N)" << endl;
    cin >> myClassRoom.Available;

    return 0;
}

或者,如果您想要全局变量,请更改其名称,以使编译器在结构和变量名称之间有所区别,然后将其用于myClassRoom (而不是classroom main()main()函数中:

struct classroom {
    int RoomNumber;
    int NumberOfChairs;
    int NumberOfStudents;
    int ListOfStudents[NumberOfStudents];
    string LectureName;
    bool Window, Projector, Available;
}myClassRoom;

编辑:您已将ListOfStudents的长度设置为固定数字,例如

int ListOfStudents[512];

然后,此代码在我的VS中编译:

struct classroom {
    int RoomNumber;
    int NumberOfChairs;
        int NumberOfStudents;
    int ListOfStudents[200];
    string LectureName;
    bool Window, Projector, Available;
};

int main(){
    classroom myClassRoom;

    cout << "Please enter your room number" << endl;
    cin >> myClassRoom.RoomNumber;
    cout << "Enter the name of the Lecture" << endl;
    cin >> myClassRoom.LectureName;
    cout << "Enter  number of students" << endl;
    cin >> myClassRoom.NumberOfStudents;
    cout << "Enter " << myClassRoom.NumberOfStudents <<  " Student Names" << endl;
    for(int i = 0; i < myClassRoom.NumberOfStudents; ++i)
    {
        cin >> myClassRoom.ListOfStudents[i];
    }
    cout << "Enter number of chairs" << endl;
    cin >> myClassRoom.NumberOfChairs;
    cout << "Are there any Windows? (Y/N)" << endl;
    cin >> myClassRoom.Window;
    cout << "Are there any Projectors? (Y/N)" << endl;
    cin >> myClassRoom.Projector;
    cout << "Are there any Available? (Y/N)" << endl;
    cin >> myClassRoom.Available;

    return 0;
}

您不能具有与结构同名的变量,请将结构底部的“教室”更改为其他名称。 或将结构设为“教室”。

struct Classroom {
    int RoomNumber;
    int NumberOfChairs;
    int NumberOfStudents;
    int ListOfStudents[NumberOfStudents];
    string LectureName;
    bool Window, Projector, Available;
}somethingelse;

您还可以使用以下命令在main中创建struct类型的变量:

classroom someClassroom;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM