0

Class と Students の 2 つのクラスを作成しました。Class コンストラクターでは、NULL に初期化された Student オブジェクトへのポインター (pStudents) の配列を動的に初期化する必要があります (ベクターは使用できません)。関数 addStudent を使用して学生をクラスに追加するとき、ポインターの配列で最初の null アドレスを検索し、その学生を配列内のその場所に割り当てられるようにしたいと考えています。学生がすでにクラスに参加している場合は、配列を検索して、この学生がすでにクラスにいるかどうかを確認できるようにしたいと考えています。

プログラムをコンパイルしようとすると、セグメンテーション違反が発生します。pStudents 配列を作成するときにヒープ メモリを使用する方法に関係していることはわかっていますが、これを解決する方法がわかりません。

クラスヘッダーファイルで配列を宣言した方法は次のとおりです。

Student **ptrStudents;

これは Class オブジェクトのコンストラクタです。今のところ、配列には任意のサイズ 40 を使用しています。

Class::Class()
{
Student **ptrStudents = new Student*[40];
}

これは、生徒オブジェクトへのポインターを引数として取る関数 addStudents です。string name はすべての学生のデータ フィールドであることに注意してください。

Class::addStudents(Student *student)
{

 string name = student -> getName();
 string nameTemp;

 for (int i = 0; i < 40; i++)
 {
    if (ptrStudents[i] != 0)
    {
       nameTemp = ptrStudents[i] -> getName();  
       if (name == nameTemp)
       {
         cout << "This student is already in the class." << endl;
         return;
        }
    }

else if (ptrStudents[i] == 0)
{
        ptrStudents[i] = student;
        return;
}

そして、ここに私が取り組んでいる主な機能があります:

int main ()
{
    Class Economics;
    Student student1("Hannah");
    Economics.addStudent(&student1);

    return 0;
}
4

4 に答える 4

0

クラス ヘッダーで宣言された配列は初期化されません。

Student **ptrStudents = new Student*[40];

これにより、ローカル変数が宣言され、新しい配列で初期化されます。

次のように変更します。

ptrStudents = new Student*[40];

于 2013-04-06T18:50:15.733 に答える
0

少なくとも 2 つのエラー

まず、配列の値を NULL に初期化する必要があります (Parker Kemp が言うように)

次に、コンストラクターで ptrStudents というローカル変数を宣言しました。これは、ptrStudents とも呼ばれるクラス変数を非表示にします。その宣言を削除する必要があります。このように

Class::Class()
{
    ptrStudents = new Student*[40];
    for(int i = 0; i < 40; i++)
        ptrStudents[i] = 0;
}
于 2013-04-06T18:50:52.733 に答える
0

配列内の各ポインターを NULL に初期化する必要があります。コンストラクターを次のように変更します。

Class::Class()
{
ptrStudents = new Student*[40];
for(int i = 0; i < 40; i++)
    ptrStudents[i] = 0;    //NULL
}

ポインターを作成すると、自動的に NULL で初期化されません。何が起こっているのかというと、ガベージ データへのランダムなポインタがたくさんあり、その行に到達すると

if (ptrStudents[i] != 0)

それらは使用できませんが、NULL ではないため、すべて合格します。

おっと、あなたのコードをコピーしたときでさえ、大きなものを見逃していました (ありがとう、ジョン)。ptrStudents 配列を再宣言しないでください。メンバー配列を初期化する代わりに、コンストラクターでローカル配列を作成します。

于 2013-04-06T18:46:57.567 に答える