如何为没有clone()成员的类编写句柄?

时间:2010-08-28 23:28:34

标签: c++ clone

我正在关注 Accelerated C ++ 中的一个示例,并编写一个简单的Handle类,它将充当智能指针。这使用virtual ctor idiom使用虚拟clone()函数。到现在为止还挺好。但是,如果我想将Handle用于我无法控制但未提供clone()的课程,该怎么办?

本书中建议的方法是创建全局clone函数并使用模板专精化(我第一次看到的内容),以便clone()使用特定参数调用,可以编写代码来处理该情况。

我的问题是:这意味着我必须为每个类创建一个clone()版本,我想我的用户可以使用{{1用。这似乎很难!有没有更优雅和/或简单的方法来解决这个问题? auto_ptr或boost :: shared_ptr之类的东西如何能够在没有繁琐的Handle定义的情况下提供此功能?

为了完整性,这是我的clone()类实现:

Handle

谢谢!

1 个答案:

答案 0 :(得分:2)

此问题的解决方案是不要为这些类编写Handle s。不,真的。

auto_ptr(从C ++ 11开始不推荐使用)永远不需要克隆底层对象,因为auto_ptr永远不会复制对象。 auto_ptr只有一个对象副本,当复制auto_ptr时,对象的控制权将被转移 - 该对象不会被复制。

unique_ptr永远不需要克隆底层对象,因为只有一个unique_ptr拥有该对象。 unique_ptr是不可复制的,只能移动。

shared_ptr永远不需要克隆,因为它也只控制对象的一个​​副本。仅复制shared_ptr会增加引用计数,并且当引用计数为零时,该单个对象将被销毁。

通常,如果没有办法深度复制您的类所控制的资源,那么您应该只使该类不可复制。如果客户需要将引用传递给您的班级,他们可以将班级放在auto_ptrunique_ptrshared_ptr中。

相关问题