C++如何正确复制指针的容器( vector )?

标签 c++ pointers containers dynamic-memory-allocation

有几次我偶然发现我有一个需要复制的指针容器。

假设我们有以下类层次结构:

  • 学生(基础类(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/

相关文章:

java - JNI 内存管理

c++ - 带有关键字 this 的构造函数中的段错误

c++ - 如何在没有轮询的情况下实现 std::when_any?

c++ - Qt:打印原始文本

c++ - 为什么我可以在 C 中将 int 文字隐式转换为 int * 而在 C++ 中却不能?

c++ - set_union 与 multiset 容器?

C++ double 到二进制表示(重新解释转换)

c++ - 尝试为图像缓冲区分配内存时错误的 ptr 值

java - "SparseArray - there can be gaps in the indices"是什么意思?

postgresql - 使用 Docker,是什么触发了 PANIC : could not locate a valid checkpoint record