有几次我偶然发现了需要复制的指针容器。C++如何正确地复制指针的容器(向量)?
比方说,我们有下面的类层次结构:
学生(基类)
- 大一(子类)
- Sophmore(子类)
- 少年(子类)
- 高级(小类)
StudentService
的StudentService类有一个std::vector<Student*> students
场和下面的构造:
StudentService::StudentService(std::vector<Student*> students) {
// code
}
这不会是正确的,只是使用std::vector::operator=
操作和写this->students = students
,因为只会复制指针地址,所以如果外部的某个人删除了这些指针所指向的对象,那么StudentService类就会因此受到影响。
解决的办法是遍历在students
参数每个指针,并创建一个新的动态对象,像这样:
for(int i = 0; i < students.size(); i++) {
this->students.at(i) = new Student(*students.at(i));
}
但即使是不正确的,由于事实,即它只能建立学生对象。我们知道一个学生可以成为新生,Sophmore,初中或高中。所以这是我的问题:什么是这个问题的最佳解决方案?
我想一个办法是将每个学生类中的私有枚举场,并有4 if-else语句检查它是什么类型的学生,然后创建一个基于像这样一个新的动态对象:
for(int i = 0; i < students.size(); i++) {
if(students.at(i).getType() == FRESHMAN) {
this->students.at(i) = new Freshman(*students.at(i));
} else if(students.at(i).getType() == SOPHMORE) {
this->students.at(i) = new Sophmore(*students.at(i));
} else if {
// and so on...
}
}
但是,这仍然看起来很繁琐,所以你会建议什么?
忘记载体。你将如何从'Student'指针创建一个'Freshman'?这是您需要在SO上搜索的问题。 – juanchopanza
http://www.boost.org/doc/libs/1_65_1/doc/html/poly_collection.html –
由于学生在不同的地方被“使用”,学生是否在你的大学克隆? – 2017-10-10 15:39:38