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

标签 c++ c++11 smart-pointers

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

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/

相关文章:

c++ - 在 temp.deduct.partial 中,为什么参数包不够专业?

c++ - QString 与 QTextStream 的所有权

c++ - C++11 中的可变长度结构非标准?

c++ - 非常量对象的 vector 在基于范围的 for 循环中似乎被视为常量

c++11 - 如果智能指针指向的对象自杀会发生什么?

C++:创建共享对象而不是指向对象的共享指针

c++ - Typedef 用于指向 C++ 中的 C 函数的指针

c++ - 单步编译时是否生成目标文件?

c++ - 从森林中构建一棵 n 叉树

c++ - C++ 中枚举和 lambda 的映射