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

C++结构无效使用非静态数据成员,c++,arrays,struct,C++,Arrays,Struct,我在非静态成员的无效使用以及结构成员无法正常工作的其他问题上遇到错误,我很难理解问题所在,谢谢 #include <iostream> #include <string> using namespace std; struct classroom { int RoomNumber; int NumberOfChairs; int NumberOfStudents; int ListOfStudents[NumberOfStudents]; string Lecture

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

#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;
}

您可以这样做,在函数中创建一个局部变量,因为不建议使用全局变量:

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;
}
编辑:例如,您可以将学生列表的长度设置为一个固定的数字

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

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;
}
编辑:例如,您可以将学生列表的长度设置为一个固定的数字

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;

不能有与结构同名的变量,请将结构底部的教室更改为其他名称。或者让结构教室

struct Classroom {
    int RoomNumber;
    int NumberOfChairs;
    int NumberOfStudents;
    int ListOfStudents[NumberOfStudents];
    string LectureName;
    bool Window, Projector, Available;
}somethingelse;
还可以使用以下命令在main中生成struct类型的变量:

classroom someClassroom;

C++不支持VLA可变长度数组,所以不应该使用ListOfStudents[NumberOfStudents]。改用常量

编辑:


此错误表示没有与type&int匹配的运算符>>。您可能希望循环并打印数组的每个元素

C++不支持VLA可变长度数组,所以您不应该使用ListOfStudents[NumberOfStudents]。改用常量

编辑:


此错误表示没有与type&int匹配的运算符>>。您可能希望循环并打印数组的每个元素

除非NumberOfStudents的类型为const int,否则不能声明数组int list of students[NumberOfStudents]。如果它是变量即非const,则编译器不知道如何为数组分配空间。所以只要改变学生的数量;限制学生人数;。然而,当您这样做时,您的结构也会期望NumberOfStudents是静态的,因此您实际上需要编写static const int NumberOfStudents

在这一点上,你将无法进入教室。学生人数,事情变得非常糟糕。我想这不是你想做的

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

也就是说,您希望按如下方式更改结构:

struct classroom {
int RoomNumber;
int NumberOfChairs;
int NumberOfStudents;
int* ListOfStudents;
string LectureName;
bool Window, Projector, Available;
}classroom;
然后,在主函数内部,或者实际上在您喜欢的任何地方,您都需要调用new来分配一些空间。像这样:

classroom.ListOfStudents = new int[classroom.NumberOfStudents];
for (int i=0; i < classroom.NumberOfStudents; i++) {
  cin >> classroom.ListOfStudents[i];
}
最后一点注意:这样做,您还需要更改您的cin>>教室。学生列表;到将所有值读入数组的循环。像这样:

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

正如其他答案所建议的那样,最好更改变量教室的名称,使其与结构的名称不匹配。然而,它应该仍然编译得很好,我对它进行了测试。这有点让人困惑。

除非NumberOfStudents是const int类型,否则不能声明数组int list of students[NumberOfStudents]。如果它是变量,即不是const,那么编译器不知道如何为数组分配空间。所以只要改变学生的数量;限制学生人数;。然而,当您这样做时,您的结构也会期望NumberOfStudents是静态的,因此您实际上需要编写static const int NumberOfStudents

在这一点上,你将无法进入教室。学生人数,事情变得非常糟糕。我想这不是你想做的

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

也就是说,您希望按如下方式更改结构:

struct classroom {
int RoomNumber;
int NumberOfChairs;
int NumberOfStudents;
int* ListOfStudents;
string LectureName;
bool Window, Projector, Available;
}classroom;
然后,在主函数内部,或者实际上在您喜欢的任何地方,您都需要调用new来分配一些空间。像这样:

classroom.ListOfStudents = new int[classroom.NumberOfStudents];
for (int i=0; i < classroom.NumberOfStudents; i++) {
  cin >> classroom.ListOfStudents[i];
}
最后一点注意:这样做,您还需要更改您的cin>>教室。学生列表;到将所有值读入数组的循环。像这样:

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

正如其他答案所建议的那样,最好更改变量教室的名称,使其与结构的名称不匹配。然而,它应该仍然编译得很好,我对它进行了测试。只是有点混淆。

我倾向于为类型和实例指定不同的名称,以避免混淆。例如,结构教室和教室。话虽如此,您需要检查名称查找规则,以查看编译器是否正确地认为课堂中的main引用了类型
或者对于一些标准容器,如vectors或lists,我倾向于为类型和实例指定不同的名称,以避免混淆。例如,结构教室和教室。话虽如此,您需要检查名称查找规则,以查看编译器是否正确地认为课堂中的main指的是类型。正如tristan所说,您应该使用常量大小的数组或一些标准容器,如vectors或Lists,它们是一个名为classroom的全局变量。代码应在不更改实例的情况下编译名称问题在于数组。有一个名为ClassRoom的全局变量,代码应在不更改实例名称的情况下编译。问题在于数组。这不是问题所在。实例名屏蔽类名不是一个好主意,但是代码应该编译。真正的问题是VLA,这不是问题所在。实例名屏蔽类名不是一个好主意,但是代码应该编译。问题实际上是VLA。或者即使数组不应该为结构的每个实例更改,也只使用std::vectorUse std::vector?或者即使数组不应该为结构的每个实例更改,也只使用std::vectorUse std::vector?