2

非静的メンバーの無効な使用や、構造体メンバーが適切に機能していないことによるその他の問題に関するエラーが発生しています。問題が何であるかを理解するのに苦労しています。ありがとうございます。

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

4 に答える 4

10

が type でint ListOfStudents[NumberOfStudents]ない限り、配列を宣言することはできません。変数の場合 (つまり、変数ではない場合)、コンパイラは配列にスペースを割り当てる方法を認識していません。に変更するだけです。ただし、これを行うと、構造体も静的であることが期待されるため、実際には.NumberOfStudentsconst intconstint NumberOfStudents;const int NumberOfStudents;NumberOfStudentsstatic 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、構造体の名前と一致しないようにすることもお勧めします。ただし、問題なくコンパイルできるはずです (テスト済み)。少し混乱しています。

于 2013-10-08T06:03:51.547 に答える
1

関数にローカル変数を作成することで、次のようにすることができます (グローバル変数は推奨されていないため)。

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

または、グローバル変数が必要な場合は、コンパイラが構造体と変数名を区別できるようにその名前を変更してから、main()関数でmyClassRoom, の代わりに使用しclassroomます。

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;
}
于 2013-10-08T05:54:26.193 に答える
0

構造体と同じ名前の変数を持つことはできません。構造体の下部にある「教室」を別のものに変更してください。または構造体を「教室」にします。

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

次を使用して、メインで構造体型の変数を作成することもできます。

classroom someClassroom;
于 2013-10-08T05:55:41.963 に答える