如何将智能指针返回到成员变量?

Log*_*acy 17 c++ smart-pointers c++11

我正在尝试使用智能指针为类成员变量创建一个访问器.这是代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

我试图编译这个错误:

无法访问类'std :: unique_ptr <_Ty>'中声明的私有成员

添加.getthis->resource当然不会,因为返回类型的变化工作.

我不应该在这里使用unique_ptr吗?这只是一个语法问题吗?我完全走错了路吗?

我的智能指针背景: 我已经使用了几年的普通指针,部分原因是因为我找不到何时使用哪种智能指针以及如何使用它们的可靠解释.我已经厌倦了找借口,所以我只是潜入.我想我明白智能指针是什么以及为什么要使用它们,但我对细节知之甚少.目前,我完全迷失在关于智能指针 无尽 问答中 .

Rei*_*ica 27

理解智能指针最重要的是"指针"方面不是它们语义的基本部分.存在表示所有权的智能指针.所有权被定义为清理责任.

一个独特的指针说:"我是指针对象的唯一所有者.当我离开范围时,我将销毁它."

一个共享指针说:"我是一群朋友中的一员,他们分担责任.我们最后一个超出范围的人将毁掉它."

(在一个现代的C++程序中,)原始指针或引用说:"我没有自己的指针,我只是观察它.别人负责摧毁它."

在您的情况下,使用unique_ptrfor成员类型意味着MyClass拥有该MyResource对象.如果getter应该转移所有权(也就是说,如果将MyClass资源放弃给任何调用getter的人),则返回a unique_ptr是合适的(并且你必须return std::move(resource);明确所有权转移).

如果getter 应该放弃所有权(我认为可能的情况),只返回一个普通的旧指针(如果返回一个空指针是一个选项)或一个普通的旧引用(如果返回null不是一个选项) .

  • 对于第三种情况,我们很快也会有`std :: experimental :: observer_ptr`. (3认同)

Bar*_*rry 21

这里有几个选项,具体取决于您希望班级观察的语义.

  1. 您想放弃资源的所有权:

    std::unique_ptr<MyResource> MyClass::releaseResource() {
        return std::move(this->resource);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您希望保持唯一的所有权,但让其他人使用它:

    MyResource& MyClass::getResource() {
        assert(this->resource);
        return *(this->resource);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您希望共享所有权,因此如果MyClass超出范围,资源不会被销毁:将所有内容切换为std::shared_ptr<MyResource>仍然按值返回.