【发布时间】:2019-03-03 06:16:00
【问题描述】:
我不确定使用包含继承对象的智能指针制作对象的深层副本的最佳/最干净的解决方案是什么。归结为以下代码
class A {};
class D1 : public A{
public:
int x1 = 0;
};
class D2 : public A {
public:
int x2 = 2;
};
class V {
public:
V(A* a) : ptr(a) {}
std::unique_ptr<A> ptr;
};
void run() {
std::vector<V> v;
v.push_back(V(new D1));
v.push_back(V(new D2));
/// I want to make a deep copy of v here
}
如果向量v 包含D1 和D2 类型的对象,那么制作v 的深层副本的最短/最优雅的方法是什么?我可以想到两种方法,都有一些缺点:
- 在基类中创建一个虚拟
A* clone()方法并在每个继承类中重载它(如here 所述)。缺点:clone方法需要在每个继承类中实例化,可能有多个。 - 为
V创建一个复制构造函数/赋值运算符。使用dynamic_cast<D1/D2>,检查附加了哪种继承对象并为该特定类型制作副本。缺点:需要遍历V的复制构造函数中的所有继承类。
【问题讨论】:
-
我喜欢解决方案 1。解决方案 2 太糟糕了。我没有看到更好的解决方案。
-
前段时间我一直在尝试使用可深度复制的
std::unique_ptr包装器,它可能对你有用:codereview.stackexchange.com/questions/197579/…
标签: c++ c++11 polymorphism smart-pointers deep-copy