提问者:小点点

如何返回指向成员变量的智能指针?


我试图使用智能指针为类成员变量创建一个访问器。代码如下:

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&>”中声明的私有成员

当然,将添加到resource/code>不能工作,因为返回类型会更改。

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

我的智能指针背景:我使用plain-old-pointers已经有几年了,部分原因是我找不到一个关于何时使用哪种类型的智能指针以及如何使用它们的确切解释。我厌倦了找借口,所以我就这么干了。我想我明白了什么是智能指针,以及为什么要使用它们,但我对其中的细节了解得很少。此刻,我完全迷失在无休止的关于智能指针的Q&A中。


共2个答案

匿名用户

关于智能指针要理解的最重要的事情是,“指针”方面并不是它们语义的基础部分。智能指针的存在是为了表示所有权。所有权定义为清理的责任。

一个独特的指针说:“我是指针的唯一拥有者。当我超出范围时,我将摧毁它。”

一个共享指针说:“我是一群共同承担被指针责任的朋友中的一员。我们中最后一个超出范围的人将会毁掉它。”

(在现代C++程序中)一个原始指针或引用表示:“我不拥有被指针,我只是观察它。其他人负责破坏它。”

在您的示例中,对于成员类型使用意味着拥有对象。如果getter应该转移所有权(也就是说,如果将资源让给调用getter的人),则返回一个是合适的(您必须才能明确地进行所有权转移)。

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

匿名用户

这里有几个选项,这取决于您希望您的类观察到的语义。

>

std::unique_ptr<MyResource> MyClass::releaseResource() {
    return std::move(this->resource);
}

您希望保持唯一的所有权,但让其他人使用它:

MyResource& MyClass::getResource() {
    assert(this->resource);
    return *(this->resource);
}

您希望共享所有权,以便在超出作用域时资源不会被破坏:将所有内容切换到/code>,并且仍然按值返回。

相关问题