我正试图使用智能指针为类成员变量创建一个访问器。这是代码:
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;
}
我试图编译这个错误:
无法访问类"std::unique_ptr<"中声明的私有成员_Ty>'
将.get
添加到this->resource
当然不起作用,因为返回类型发生了更改。
我不应该在这里使用unique_ptr吗?这只是语法问题吗?我是不是完全走错了路?
我的智能指针背景:几年来,我一直在使用普通的旧指针,部分原因是我找不到一个确切的解释来解释何时使用哪种类型的智能指针以及如何使用它们。我已经厌倦了找借口,所以我只是投入其中。我想我明白什么是聪明的指针以及为什么要使用它们,但我对细节了解甚少。此刻我完全迷失在无尽的问答中;A关于智能指针。
了解智能指针最重要的一点是,"指针"方面不是其语义的基本部分。智能指针的存在表示所有权。所有权被定义为清理的责任。
一个独特的指针说:"我是指针对象的唯一所有者。当我超出范围时,我会销毁它。"
一个共享的指针说:"我是一群对指针对象负有共同责任的朋友之一。我们最后一个超出范围的人会摧毁它。"
(在现代C++程序中,)一个原始指针或引用说:"我不拥有指针对象,我只是观察它。其他人要负责破坏它。"
在您的情况下,使用unique_ptr
作为成员类型意味着MyClass
拥有MyResource
对象。如果getter应该转移所有权(也就是说,如果MyClass
将资源放弃给调用getter的人),则返回unique_ptr
是合适的(并且必须使用return std::move(resource);
才能明确所有权转移)。
如果getter是而不是应该放弃所有权(我认为这是可能的情况),只需返回一个纯旧指针(如果返回null指针是一个选项)或一个纯老引用(如果返回null不是一个选项的话)。
这里有几个选项,具体取决于您希望类遵守的语义。
-
您想放弃对资源的所有权:
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>
,并且仍然按值返回。