有几次我偶然发现我有一个需要复制的指针容器。
假设我们有以下类层次结构:
学生(基础类(class))
- 新生(子类)
- 大二(子类)
- 初级(子类)
- 高级(子类)
学生服务
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));
}
但即使这样也不合适,因为它只会创建 Student 对象。我们知道学生可以是新生、大二学生、大三学生或大四学生。所以这是我的问题:这个问题的最佳解决方案是什么?
我想一种方法是在每个 Student 类中放置一个私有(private)枚举字段,并有 4 个 if-else 语句检查它是什么类型的 Student,然后基于它创建一个新的动态对象,如下所示:
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 添加一个 clone() 虚函数,它在每个后代中被覆盖并创建适当的拷贝。然后按照您正确指定的方式编写容器的深层拷贝。
编辑:我的工作假设是您的 Freshman 等类(class)是 Student 的后代。如果不是,请使用变体<>并应用复制访问者。
关于C++如何正确复制指针的容器( vector )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46670292/