3

クラス教員には、科目のセットがあります。このセットを調べて、各科目で、この科目に学生を追加する関数を呼び出したいと思います。これが私の関数の外観です。

void Faculty::addStudent(Student* n) {
    this->Students.insert(n);
    set<Subject*>::iterator it;

    for(it = this->Subjects.begin(); it != this->Subjects.end(); it++) {
        (*it)->addStudent(n);
    }
}

問題は、エラーが発生することです。

Unhandled exception at 0x01341c6d in University.exe: 0xC0000005: Access violation reading location 0x1000694d.

Micorosft Visual 2010 を使用しています。

私はC++が初めてです。

他に必要な情報を提供できますが、どれかわかりません。必要なものがあれば教えてください。

class Student: public Human {
    friend class University;
    friend class Faculty;
    friend class Subject;
public:
    Student(string name, string surname);
    ~Student();
    void Index(int n);
private:
    int index;
};
4

1 に答える 1

10

ほとんどの場合、2 つ以上のクラス間でデータを共有する場合、生データ ポインターの代わりにスマート ポインターを使用することをお勧めします。

例。最初に、次のようにポインターをラップします。

typedef shared_ptr<Student> StudentSPtr;
typedef shared_ptr<Subject> SubjectSPtr;

この後、コード全体で生のポインターをこれらのポインター (StudentSptr nの代わりに) に置き換えます。Student* nしたがって、関数は次のようになります。

void Faculty::addStudent(StudentSptr n){
  this->Students.insert(n);
  vector<SubjectSPtr>::iterator it;  //in your case vector is more proper, I think

  for(it = this->Subjects.begin(); it != this->Subjects.end(); it++){
    (*it)->addStudent(n);
    }
}
于 2012-06-14T11:30:45.377 に答える