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

标签 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;
}

错误

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;
                  ^

最佳答案

您不能声明数组 int ListOfStudents[NumberOfStudents],除非 NumberOfStudentsconst 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;

然后在您的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++ 结构无效使用非静态数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19240004/

相关文章:

c - 如何在结构数组中初始化和动态分配一个 int 指针成员?

c++ - Process Explorer 中的可拖动十字线如何工作?

c++ - 加速 C++ : Can I write a program that sorts either a list or a vector using the same command?

c++ - 在另一个结构中初始化一个结构数组

c - 在C中,是否必须传递字符数组名称才能更改字符串常量的字符?

结构 vector 的 C++ 初始化

c++ - 是否可以在 qmake .pro 文件中设置 visual studio 项目属性?

java - 如何修复 env->NewObject 上的 JNI 崩溃?

ios - 如何根据唯一属性值对字典数组进行分组?

swift - 如何将变量从 ViewController 类传递到其他结构?