唯一/shared_ptr自定义操作符=
unique/shared_ptr with custom operator=
我正在使用一个多态类型(也就是说,我总是通过一个指针与它交互),它有方法"Destroy()"answers"Clone()",我想把它包装在一个资源安全的类型。
现在,如果"Destroy()"是我所要担心的,那么我可以使用unique_ptr和一个自定义删除器,这将是很容易的。但是,此资源句柄类型用作另一类型的成员,否则可以使用默认生成的复制和赋值操作复制该类型。理想情况下,我想定制资源句柄的复制构造函数和赋值来调用"Clone()",就像我已经定制资源句柄的析构函数来调用"Destroy()"一样。但是通过unique_ptr和shared_ptr的文档,我没有看到任何可以让我这样做的东西。
- 我在文档中错过了什么吗?有没有现成的方法来做到这一点? 如果没有,我应该扩展unique_ptr并覆盖复制操作吗?或者,我应该从头开始写我自己的资源句柄与所有通常的指针语义吗?
您可以围绕std::unique_ptr
创建包装
// To handle your cusstom Destroy
struct DestroyDeleter
{
void operator(Interface* o) {
object->Destroy();
delete object;
}
};
using InterfacePtr = std::unique_ptr<Interface, DestroyDeleter>;
// To handle the copy with clone:
class wrapper
{
public:
explicit wrapper(InterfacePtr o) : data(std::move(o)) {}
wrapper(const wrapper& rhs) : data(rhs.data->Clone()) {}
wrapper(wrapper&& rhs) = default;
wrapper& operator =(const wrapper& rhs) { data = rhs.data->Clone(); }
wrapper& operator =(wrapper&& rhs) = default;
const Interface* operator ->() const { return data.get(); }
Interface* operator ->() { return data.get(); }
const Interface& operator *() const { return data; }
Interface& operator *() { return *data; }
private:
InterfacePtr data;
};
使用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()
给你一个智能指针从一开始。
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 重载自定义类集的提取操作符
- 操作符new已在带有库的自定义内存管理器中定义
- 自定义迭代器操作符重载
- 将facet应用于所有流输出,使用自定义字符串操作符
- 在b树的自定义迭代器中使用操作符*出错
- 重载c++实类型和自定义复杂类型之间的强制转换操作符()
- CUDA应用程序的自定义类int2_, float2_和double2_之间的重载操作符=
- 唯一/shared_ptr自定义操作符=
- 重载& lt; & lt;用于打印自定义异常的操作符
- Make_shared与自定义的新操作符
- 一个自定义的向量和矩阵类在c++和操作符[]
- 重载自定义栈实现中的==操作符
- 如何在不重载比较操作符的情况下为std::max专门化自定义类型
- 自定义复制赋值操作符使程序崩溃(c++)
- 操作符的算法重载-用于自定义整数类