如何用unique_ptr实施零规则
How to implement the Rule of Zero with unique_ptr
我实际上想做一个零规则的例子,对一个类进行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;
};
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 在没有太多条件句的情况下,我如何避免被零除
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- 此代码是否违反一个定义规则
- 矩阵向量乘法(cublasDgemv)返回零
- 生成文件不对文件使用隐式规则
- 是否可以对零模板参数进行模板专门化
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- 静态结构和一个定义规则
- 处理除以零会导致<csignal>意外行为
- 在C++中向零方向近似的最佳方法
- 尽管遵循了规则,内存泄漏在哪里
- 这是关于成员访问规则的正确摘要吗
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 如何用unique_ptr实施零规则
- 如何正确地将规则 5(或零?)应用于包含带有字符串的自定义对象向量的类
- 零规则与基类析构函数
- 模板,良好形成性和零包长度规则
- 填充矩形,并在opengl中应用非零绕线规则
- 理解零规则