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

use*_*339 4 c++ std c++11

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

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

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

private:
    std::unique_ptr<Node> m_root;
};
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*k B 6

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

如果你绝对坚持需要这个,至少返回指针const,例如const Node* GetRoot() const因为外部客户端绝对不应该改变树结构.