如何return一个成员变量的智能指针?

How to return a smart pointer to a member variable?

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

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当然不行,因为return类型改变了。

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

我的智能指针背景: 几年来我一直在使用普通指针,部分原因是我找不到关于何时使用哪种类型的智能指针以及如何使用它们的可靠解释。我厌倦了找借口,所以我只是一头扎进去。我想我明白什么是智能指针以及为什么要使用它们,但我对细节知之甚少。此刻我完全迷失在 the endless Q&A about smart pointers.

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

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

    std::unique_ptr<MyResource> MyClass::releaseResource() {
        return std::move(this->resource);
    }
    
  2. 您想保留唯一的所有权,但让其他人使用它:

    MyResource& MyClass::getResource() {
        assert(this->resource);
        return *(this->resource);
    }
    
  3. 您想 共享 所有权,因此如果 MyClass 超出范围,资源不会被破坏:将所有内容切换为 std::shared_ptr<MyResource> 并且按值仍然 return。

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

一个独特的指针说:"I am the sole owner of the pointee. I will destroy it when I go out of scope."

共享指针表示:"I am one of a group of friends who share the responsibility for the pointee. The last of us to go out of scope will destroy it."

(在现代 C++ 程序中,)原始指针或引用表示:"I do not own the pointee, I merely observe it. Someone else is responsible for destroying it."

在您的例子中,使用 unique_ptr 作为成员类型意味着 MyClass 拥有 MyResource 对象。如果 getter 应该转移所有权(也就是说,如果 MyClass 将资源放弃给调用 getter 的任何人),returning a unique_ptr 是合适的(您必须 return std::move(resource); 明确所有权转让)。

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