c++ - 拥有一个具有原始指针访问器的 unique_ptr 成员是不好的做法吗?

标签 c++ c++11 std

我有一个类有一个 unique_ptr 成员,并且这个类保留这个对象的唯一所有权。但是,外部类可能需要访问此对象。在这种情况下,我应该只返回一个原始指针吗? shared_ptr 似乎不正确,因为这意味着访问类现在共享该内存的所有权,而我想明确指出原始类是唯一所有者。

例如,也许我有一个拥有根节点的树类。另一个类可能出于某种原因希望探索树,并且需要指向根节点的指针来执行此操作。部分实现可能如下所示:

class Tree
{    
public:
    Node* GetRoot()
    {
        return m_root.Get();
    }

private:
    std::unique_ptr<Node> m_root;
};

这是不好的做法吗?更好的解决方案是什么?

最佳答案

一个更正常的实现可能是Tree暴露迭代器或提供一个visit机制来探索树,而不是暴露的实现细节树本身。公开实现细节意味着您永远无法更改树的底层结构,而不会有破坏该代码的谁知道有多少客户的风险。

如果您绝对坚持需要这样做,至少将指针作为 const 返回,例如 const Node* GetRoot() const 因为外部客户端绝对不应该正在改变树结构。

关于c++ - 拥有一个具有原始指针访问器的 unique_ptr 成员是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15977077/

相关文章:

c++ - 调用隐式删除的复制构造函数

c++ - 有什么方法可以告诉链接器 "respect"__attribute__((__used__))

c++ - 在 C++ 中流式传输字符串文字

c++ - std::max 与 lambda 和 auto

c# - 从 C++ 传递到 C# 的字符串打印空白

c++ - 模板函数在模板对象上执行成员回调而不提供它的实例

c++ - 字符串中的十六进制到整数中的十六进制

c++ - 结构偏移量不同?

c++ - 了解 C++ 重构语法

c++ - 容器比较器使用虚拟实例