如何用unique_ptr实施零规则

How to implement the Rule of Zero with unique_ptr

本文关键字:施零 规则 ptr 何用 unique      更新时间:2023-10-16

我实际上想做一个零规则的例子,对一个类进行unique_ptr。 这是我的示例代码:

#include <iostream>
#include <memory>
// Rule of zero?
template <class T>
class myStruct
{
int m_timesToPrint{0};
std::unique_ptr<T> m_ptr;
public:
myStruct(int tToPrint, const T& val)
: m_timesToPrint(tToPrint), m_ptr(std::make_unique<T>(val))
{ }
myStruct() = default;
myStruct(const myStruct&) = default;
friend std::ostream& operator<<(std::ostream& os, const myStruct<T>& rhs)
{
for(auto i = 0; i < rhs.m_timesToPrint; ++i)
{
os << *(rhs.m_ptr.get()) << "n";
}
os << "---------------n";
return os;
}
};

int main()
{
myStruct<int> m1(3, 3);
// myStruct<int> m2 = m1; // Error!
std::cout << m1;
// std::cout << m2;
return 0;
}

显然,我在 m2 = m1 线上有问题,因为unique_ptr(const unique_ptr&) = deleted被删除了,但我该怎么做这个例子呢?

谢谢!

使用零规则,甚至不需要默认构造函数:

template <class T>
class myStruct
{
int m_timesToPrint{0};
std::unique_ptr<T> m_ptr;
public:
myStruct(int tToPrint, const T& val)
: m_timesToPrint(tToPrint), m_ptr(std::make_unique<T>(val))
{ }
myStruct() = default;
// myStruct(const myStruct&) = default; // not needed
// ... other stuff
};

显然,我在m2 = m1行上遇到了问题,因为unique_ptr(const unique_ptr&) = deleted被删除了,但是我该怎么做那个例子呢?

好吧,您的零规则已正确实现。如果您希望副本正常工作,则需要与std::unique_ptr不同的工具。

我的建议是创建一个复制其资源的指针类型,或者如果要共享资源而不是复制资源,请使用std::shared_ptr

这样的指针可能如下所示:

template<typename T>
struct clone_ptr {
clone_ptr(clone_ptr const& other) : /* initialize `_ptr` with copy */ {}
clone_ptr(clone_ptr&&) = default;
clone_ptr& operator=(clone_ptr&&) = default;
// implement copy assign
// implement operators
private:
std::unique_ptr<T> _ptr;
};