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

ssj*_*878 1 c++ arrays struct

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

错误

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;
                  ^
Run Code Online (Sandbox Code Playgroud)

Mic*_*ver 8

int ListOfStudents[NumberOfStudents]除非NumberOfStudents是类型,否则不能声明数组const int.如果它是可变的(即不是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;
Run Code Online (Sandbox Code Playgroud)

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

classroom.ListOfStudents = new int[classroom.NumberOfStudents];
Run Code Online (Sandbox Code Playgroud)

最后一点:完成此操作后,您还需要将您更改cin >> classroom.ListOfStudents;为一个循环,将所有值读入您的数组.像这样:

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

正如其他答案所建议的那样,更改变量的名称也是一个好主意,classroom因此它与结构的名称不匹配.但它应该仍然编译得很好(我测试了它).这有点令人困惑.

  • 或者只使用std :: vector (2认同)