在班级学院,我有一套科目。我想通过这个集合,并在每个主题上调用一个函数,将学生添加到这个主题。 这是我的功能看起来的方式。
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;
};
答案 0 :(得分:7)
在大多数情况下,更好的做法是在两个或多个类之间共享数据时使用smart pointers而不是原始数据指针。
实施例。首先,我们包装这样的指针:
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);
}
}