我试图使用智能指针为类成员变量创建一个访问器。这是代码:
class MyResource
{
};
class MyClass
{
public:
std::unique_ptr<MyResource> getResource();
private:
std::unique_ptr<MyResource> resource;
};
std::unique_ptr<MyResource> MyClass::getResource()
{
return this->resource;
}
我试图编译这个错误:
无法访问在课程中声明的私人成员&#39; std :: unique_ptr&lt; _Ty&gt;&#39;
将.get
添加到this->resource
当然不起作用,因为返回类型会发生变化。
我不应该在这里使用unique_ptr吗?这只是一个语法问题吗?我完全走错了路吗?
我的智能指针背景: 我已经使用了几年的普通指针,部分原因是因为我无法找到何时使用哪种智能指针以及如何使用它们的可靠解释。我已经厌倦了找借口,所以我只是潜入。我想我明白智能指针是什么以及为什么要使用它们,但我对细节知之甚少。目前,我完全迷失在the endless Q&A about smart pointers。
答案 0 :(得分:26)
理解智能指针最重要的是“指针”方面不是它们语义的基本部分。存在智能指针以表示所有权。所有权被定义为清理责任。
一个独特的指针说:“我是指针对象的唯一所有者。当我离开范围时,我会销毁它。”
一个共享指针说:“我是一群朋友中的一员,他们分担责任。我们最后一个超出范围会破坏它。”
(在现代的C ++程序中,)原始指针或引用说:“我不拥有指针,我只是观察它。其他人负责销毁它。”
在您的情况下,使用unique_ptr
作为成员类型意味着MyClass
拥有MyResource
对象。如果getter应该转移所有权(也就是说,如果MyClass
将资源放弃给任何调用getter的人),则返回unique_ptr
是合适的(并且你必须{{1}使所有权转移明确)。
如果getter 不应该放弃所有权(我认为可能的情况),只返回一个普通的旧指针(如果返回一个空指针是一个选项)或一个普通的老引用(如果返回null不是一个选项)。
答案 1 :(得分:21)
这里有几个选项,具体取决于您希望班级观察的语义。
您想放弃资源的所有权:
std::unique_ptr<MyResource> MyClass::releaseResource() {
return std::move(this->resource);
}
您希望保持独特的所有权,但让其他人使用它:
MyResource& MyClass::getResource() {
assert(this->resource);
return *(this->resource);
}
您希望分享所有权,因此如果MyClass
超出范围,资源就不会被销毁:将所有内容切换为std::shared_ptr<MyResource>
并仍然按价值回报。