我正在关注 Accelerated C ++ 中的一个示例,并编写一个简单的Handle
类,它将充当智能指针。这使用virtual ctor idiom使用虚拟clone()
函数。到现在为止还挺好。但是,如果我想将Handle
用于我无法控制但未提供clone()
的课程,该怎么办?
本书中建议的方法是创建全局clone
函数并使用模板专精化(我第一次看到的内容),以便clone()
使用特定参数调用,可以编写代码来处理该情况。
我的问题是:这意味着我必须为每个类创建一个clone()
版本,我想我的用户可以使用{{1用。这似乎很难!有没有更优雅和/或简单的方法来解决这个问题? auto_ptr或boost :: shared_ptr之类的东西如何能够在没有繁琐的Handle
定义的情况下提供此功能?
为了完整性,这是我的clone()
类实现:
Handle
谢谢!
答案 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_ptr
,unique_ptr
或shared_ptr
中。