首页 >后端开发 >C++ >如何正确复制包含 `unique_ptr` 成员的 C 11 类?

如何正确复制包含 `unique_ptr` 成员的 C 11 类?

Barbara Streisand
Barbara Streisand原创
2024-12-03 00:30:10848浏览

How to Properly Copy C  11 Classes Containing `unique_ptr` Members?

在 C 11 中复制具有唯一指针的类

为包含 unique_ptr 的类创建复制构造函数,unique_ptr 是一个强制独占所有权的智能指针,提出了独特的挑战。在 C 11 中,管理 unique_ptr 成员需要仔细考虑。

解决方案:

要实现复制构造函数,您有两个选择:

  1. 深层复制: 创建 unique_ptr 内容的新副本。这确保两个对象独立地拥有自己的数据。
class A {
  std::unique_ptr<int> up_;
public:
  A(int i) : up_(new int(i)) {}
  A(const A& a) : up_(new int(*a.up_)) {}
};
  1. 转换为shared_ptr:将unique_ptr转换为shared_ptr,这允许多个所有者。
std::shared_ptr<int> sp = std::make_shared<int>(*up_);

额外注意事项:

  • 移动构造函数:您可以使用移动构造函数来代替复制构造函数,它会转移 unique_ptr 的所有权。
A(A&& a) : up_(std::move(a.up_)) {}
  • 重载其他运算符:对于一组完整的操作,重载赋值运算符会很有帮助。
A& operator=(const A& a) { up_.reset(new int(*a.up_)); return *this; }
A& operator=(A&& a) { up_ = std::move(a.up_); return *this; }
  • 向量注意事项:如果您打算在 std 中使用您的类: :vector,决定该向量是否独占该对象。您可以通过省略复制构造函数和复制赋值运算符来强制执行仅移动行为。

以上是如何正确复制包含 `unique_ptr` 成员的 C 11 类?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn