我有一个函数,它接受一个指向超类的指针并对其执行操作。但是,在某些时候,该函数必须对输入的对象进行深层复制。有什么办法可以进行这样的复制吗?
我想到将函数设为模板函数并简单地让用户传递类型,但我希望 C++ 提供更优雅的解决方案。
我有一个函数,它接受一个指向超类的指针并对其执行操作。但是,在某些时候,该函数必须对输入的对象进行深层复制。有什么办法可以进行这样的复制吗?
我想到将函数设为模板函数并简单地让用户传递类型,但我希望 C++ 提供更优雅的解决方案。
SpaceCowboy 提出了惯用的clone
方法,但忽略了 3 个关键细节:
class Super
{
public:
virtual Super* clone() const { return new Super(*this); }
};
class Child: public Super
{
public:
virtual Child* clone() const { return new Child(*this); }
};
clone
是一种const
方法clone
返回指向当前类的指针,而不是基类clone
返回当前对象的副本第二个非常重要,因为它允许使用受益于有时你有更多类型信息而不仅仅是Super*
.
另外,我通常更喜欢clone
提供一个副本,而不仅仅是一个相同类型的新对象。否则,您正在使用一种Exemplar
模式来构建新对象,但您没有正确克隆并且名称具有误导性。
我在 wxWidgets 中看到的一个示例是定义一个覆盖方法“克隆”,以便在每个类中您都可以进行适当的深层复制,但该方法将副本作为超类返回。
(然后有其他答案的例子)