【问题标题】:C++ constructor copy of an array of derived classes派生类数组的 C++ 构造函数副本
【发布时间】:2018-08-22 00:10:04
【问题描述】:

虽然有很多帖子在复制构造函数中管理指针,但我没有找到合适的答案来正确实现以下内容。

A 类的对象“a”存储一个元素“tab”数组,这些元素是指向 B1 或 B2 类型元素的指针,它们都派生自 B 类。

我想通过调用复制构造函数来保存“a”的副本(以便稍后恢复)。 我的问题是在这个复制构造函数中分配内存,复制 'tab[i]' 元素的内容。

必须有一种规范的方式来做到这一点(我想没有调用 来确定这是 B1 还是 B2)。

这是我为说明问题而构建的 MWE:

#include <iostream>
using namespace std;


//-----------------------
class B {
public:
  virtual void display()=0;
};

//-----------------------
class B1 : public B {
public:
  B1() : val(1)  // ctor
  {}  
  void display() {
    cout << val << endl;
  }
private:
  int val;

};
//-----------------------
class B2 : public B {
public:
  B2() : val(2)  // ctor
  {}
  void display() {
    cout << val << endl;
  }
private:
  int val;

};

//---------- A -------------
class A {

public:
  A () {            // ctor
    tab = new B * [2];
    tab[0] = new B1;
    tab[1] = new B2;
  } 

  A (A const &orig)         // copy ctor
    : tab(orig.tab)
  {          
    // ... HOW should i make a copy of the tab[i] elements ?...
    // ... as i do not know if tab[i] is type B1 or B2 ...
  }

  void display() {
    tab[0]->display();   
    tab[1]->display();   
  }


private:
  B ** tab;
};




//------M A I N ---------

int main() {
  A a;
  a.display();

  return 0;
}

【问题讨论】:

标签: c++


【解决方案1】:

如果不确定 B 的具体类型,则无法执行此操作,方法是使用 dynamic_cast 或调用虚拟方法,然后将其分派到具体类型。

这通常通过在B的接口上使用“克隆”模式来解决,将函数添加到Bvirtual B* clone() const = 0; 每个实现都分配并返回其自身的适当副本。

还请注意,您不会删除示例中分配的任何内存。记得在析构函数中这样做,或者更好地使用像 std::unique_ptr 这样的智能指针!

【讨论】:

  • 谢谢!现在我确定 clone() 模式在这里适用。请注意,我没有包括删除分配的内存只是为了提供一个可以构建和显示某些东西的最小示例。
  • 这样想:最小的例子。是的,不幸的是,您的直觉是正确的(围绕进行克隆的大量样板代码)。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2015-08-18
  • 2018-07-11
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 2016-07-19
  • 2023-04-10
相关资源
最近更新 更多