【发布时间】:2018-03-22 01:41:37
【问题描述】:
有几次我偶然发现我有一个需要复制的指针容器。
假设我们有以下类层次结构:
-
学生(基类)
- 大一(子类)
- Sophmore(子类)
- 初级(子类)
- 高级(子类)
学生服务
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 类中放置一个私有枚举字段,并有 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指针创建Freshman?这就是您需要在 SO 上搜索的问题。 -
学生是否因为在不同地方被“使用”而被克隆到你的大学?
-
您可以使用智能指针(在本例中为
std::shared_ptr)来确保即使一个副本被销毁,对象也能保持活动状态。
标签: c++ pointers containers dynamic-memory-allocation