虽然在复制构造函数中有许多管理指针的帖子,但我没有找到合适的答案来正确实现以下内容。
A类的对象'a'存储一个'tab'元素数组,这些元素是指向B1或B2类型元素的指针,两者都是从B类派生的。
我想通过调用复制构造函数来保存“a”的副本(以便稍后恢复)。 我的问题是在这个拷贝构造函数中分配内存,以复制'tab [i]'元素的内容。
必须有一种规范的方式来做到这一点(我想没有调用 < dynamic_cast的>确定这是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;
}
答案 0 :(得分:4)
如果不通过使用dynamic_cast
确定B的具体类型,或者通过调用虚拟方法,然后将其分派到具体类型,则无法执行此操作。
这通常通过使用&#34;克隆&#34;来解决。 B
界面上的模式,将函数添加到B
:
virtual B* clone() const = 0;
每个实现分配并返回自己的适当副本。
另请注意,您没有删除示例中分配的任何内存。记得在析构函数中执行此操作,或者更好地使用像std :: unique_ptr!
这样的智能指针