通过迭代器调用函数?

use*_*380 3 c++ iterator function

在班级学院,我有一套科目.我想通过这个集合,并在每个主题上调用一个函数,将学生添加到这个主题.这是我的功能看起来如何.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我收到一个错误:

Unhandled exception at 0x01341c6d in University.exe: 0xC0000005: Access violation reading location 0x1000694d.
Run Code Online (Sandbox Code Playgroud)

我正在使用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;
};
Run Code Online (Sandbox Code Playgroud)

vla*_*_ki 7

在大多数情况下,更好的做法是在两个或多个类之间共享数据时使用智能指针而不是原始数据指针.

例.首先,我们包装这样的指针:

typedef shared_ptr<Student> StudentSPtr;
typedef shared_ptr<Subject> SubjectSPtr;
Run Code Online (Sandbox Code Playgroud)

在此之后,我们在整个代码中用这些指针(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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @ user1455380最好的感谢方式是upvote并接受有用的答案. (2认同)