我正在尝试使用智能指针为类成员变量创建访问器。代码如下:
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;
}
我在编译时遇到的错误:
cannot access private member declared in class 'std::unique_ptr<_Ty>'
将 .get
添加到 this->resource
当然是行不通的,因为返回类型发生了变化。
我不应该在这里使用 unique_ptr 吗?这只是语法问题吗?我完全走错了吗?
我的智能指针背景: 几年来我一直在使用普通的旧指针,部分原因是我找不到关于何时使用哪种类型的智能指针以及如何使用它们的可靠解释。我厌倦了找借口,所以我只是潜入。我想我了解什么是智能指针以及为什么要使用它们,但我对细节了解甚少。目前我完全迷失在the endless Q&A about smart pointers .
最佳答案
了解智能指针最重要的一点是,“指针”方面不是它们语义的基本部分。存在智能指针以表示所有权。所有权被定义为清理的责任。
一个唯一的指针说:“我是指针的唯一所有者。当我超出范围时,我会销毁它。”
共享指针说:“我是一群 friend 中的一员,他们对指针负责。我们中最后一个超出范围的人会破坏它。”
(在现代 C++ 程序中,)原始指针或引用说:“我不拥有指针,我只是观察它。其他人负责销毁它。”
在您的情况下,对成员类型使用 unique_ptr
意味着 MyClass
拥有 MyResource
对象。如果 getter 应该转移所有权(即,如果 MyClass
将资源放弃给调用 getter 的人),则返回 unique_ptr
是合适的(并且您必须return std::move(resource);
以明确所有权转移)。
如果 getter 不 应该放弃所有权(我认为这是可能的情况),只需返回一个普通的旧指针(如果返回空指针是一个选项)或一个普通的旧指针引用(如果返回 null 不是一个选项)。
关于c++ - 如何将智能指针返回到成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29498976/