C++ 关于向量推回和返回指针
我有一个问题与C++ 关于向量推回和返回指针,c++,C++,我有一个问题与School::addStudent(…) 这是来自班级学校编码 class School { string schoolName ; vector<Student> students; public: School(const string& _schoolName) : schoolName(_schoolName) {} Student* addStudent(const s
School::addStudent(…)
这是来自班级学校
编码
class School {
string schoolName ;
vector<Student> students;
public:
School(const string& _schoolName) : schoolName(_schoolName) {}
Student* addStudent(const string& name, MajorType majorType) {
students.push_back(Student(name, 0, majorType));
return &students[students.size()-1];
}
Student* addStudent(const string& name, const float gpa) {
students.push_back(Student(name, gpa, UD));
return &students[students.size()-1];
}
...
}
这是专业课
class Major {
MajorType majorType ;
public:
Major(const MajorType _majorType) : majorType(_majorType) {}
MajorType getmajorType() const {
return majorType;
}
void setMajor(const MajorType _majorType) {
majorType=_majorType;
}
};
这是一个简单的枚举。如果你想,跳过
enum MajorType {CE, EE, ME, UD};
问题就在这里。 当我用这种方式编写
Student*addStudent
代码时,效果很好
但是当我编码Student*addStudent
Student* addStudent(const string& name, MajorType majorType) {
Student* tmp = new Student();
tmp->set(name, majorType);
students.push_back(*tmp);
return tmp;
}
Student* addStudent(const string& name, const float gpa) {
Student* tmp = new Student();
tmp->set(name, gpa);
students.push_back(*tmp);
return tmp;
}
这样就不行了。
它确实可以编译,但是当它在主代码中点击kim->setGPA时,下面的数字不会进入矢量学生。我认为这与内存地址和按值复制有关,但我不知道为什么我的代码会出错
对于那些想知道后一个代码结果的人
学校名称:PNU,计数:4
姓名:Kim GPA:0专业:电气工程。
姓名:洪GPA:0专业:计算机工程。
姓名:李GPA:4专业:待定。
姓名:Joo GPA:1.5专业:待定
主代码有一些关于Kim和Hong的GPA以及Lee和Joo的专业的输入,但代码就是不起作用
感谢您阅读我的这个长长的问题,如果您能解决这个问题,我将不胜感激,因为我从昨天开始就在思考这个问题如果您的编译器支持Cpp11,请替换
vector<Student> students;
你被错误地认为“这种方式”工作“很好”。任何向后推入向量的
都会重新分配向量,使指向该向量的所有现有指针无效。这恰好是您以前调用addStudent
()时返回的。接着是山丘。哦,“不工作”的好版本也被打破了,但方式完全不同。由于不同的原因,addStudent
显示的备选方案都不能正常工作。您可以分配一个新学生。你安排了新学生。然后你复制学生并将副本放入向量中。然后返回指向原始学生的指针。当然,如果你改变原来的学生,它不会改变副本,因为副本是一个完全不同的学生。你的具体问题是什么?我觉得你写的东西太多了。很好,你做了一些研究,尝试了不同的东西,但这让问题很难理解。请尝试将您的代码缩减为一。@SamVarshavchik您确定任何推回都可以重新分配吗?我认为只有当容量等于大小时,push_back
才能重新分配。(这样,如果您保留
,向后推
在容量满之前不得重新分配。)@DanielLangraddStudent
没有记录到对student
容量有先决条件,因此可以调用addStudent
重新分配
vector<Student> students;
vector<std::shared_ptr<Student>> students;
Student* addStudent(const string& name, const float gpa) {
Student* tmp = new Student();
tmp->set(name, gpa);
students.push_back(*tmp);
return tmp;
}