的原因之一,对于具有unique_ptr
和shared_ptr
是复制和周围杂耍这些指针是一种廉价的操作,并不涉及复制基础对象。
这就是为什么智能指针不能实现任何手段来安装您自己的operator=
。正如我理解你的问题,当智能指针被复制时,你想要调用自定义的Clone()
和Destroy()
方法。
那么,unique_ptr
和shared_ptr
执行自己operator=
这是正确的事情。
对于初学者来说,无论你的Destroy()
是做什么都应该在你的类的析构函数中完成。这是一个析构函数。然后,您的clone()
方法只需要克隆自己的对象,并返回一个新的unique_ptr
,因此,当您已经有一个现有的unique_ptr
或shared_ptr
时,使用它调用clone()
方法克隆该对象并返回一个智能指针指向克隆对象:
std::unique_ptr<myClass> p; // Or std::shared_ptr
// p is initialized, populated from there.
std::unique_ptr<myClass> new_p=p->clone();
具有独特Destroy()
方法必须销毁的对象之前被调用是产卵的错误无尽的游行的邀请。在销毁克隆对象时忘记调用它只是一个时间问题。
避免用代码中的错误创建和浪费时间的最佳方法是使它们在逻辑上不可能发生。如果为了销毁一个对象需要做些什么,这需要在析构函数中完成。如果为了销毁从另一个对象克隆的对象需要做一些额外的工作,对象需要有一个内部标志来指示它是一个克隆对象,并且它的析构函数根据这个标准来做正确的事情。
一旦完成,通过忘记做某件事来摆脱克隆的对象,将会使代码变得逻辑上不可行。您可以祝贺自己在未来拯救自己,免得浪费时间寻找一堆现在永远不会创建的bug。你未来的自我会感谢你的过去的自我。只需使用智能指针就可以使用,并且从一开始就有clone()
为您提供智能指针。
encapsulate unique_ptr。 –
将'unique_ptr'换成某种类型,并为其执行移动和复制操作。这些动作可以默认,复制会调用'克隆'。 –
Praetorian
我怀疑你真的不想调用'Clone()',除非你想结束两个不同的由两个独立的智能指针管理的类型的对象。 – Galik