gpt4 book ai didi

c++ - 如何使用 unique_ptr 实现零规则

转载 作者:行者123 更新时间:2023-11-30 03:12:54 27 4
gpt4 key购买 nike

我实际上想在一个类上用 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
};

Obviously, i have a problem on m2 = m1 line, because unique_ptr(const unique_ptr&) = deleted is deleted, but how can i do that example?

好吧,您的零规则已正确实现。如果你想让拷贝工作,你需要一个不同于 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;
};

关于c++ - 如何使用 unique_ptr 实现零规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59146954/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com