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

时间:2013-04-12 17:06:25

标签: c++ c++11 std

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

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

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

Scott Meyers, Effective C ++ 第15项说是,尽管主要原因是与遗留代码进行交互。如果您处于受控环境中 - 例如一个没有遗留代码的创业公司,可以根据需要或在家庭作业中轻松扩展课程 - 可能没有什么需要,它可能只会鼓励错误地使用课程。但更可重用的方法是暴露原始资源。

答案 2 :(得分:0)

请记住,当人们说“避免使用指针”时,他们的意思是“使用所有权语义”,并且指针本身并不坏。

返回非拥有指针是获取引用的可接受方式,这些引用也可能为null并且不会比替代方法更危险。现在,在您的情况下,只有在您的树用作时才会有意义,而不是像std::map那样在内部使用树。

这种做法并不常见,因为通常你会希望抽象出指针和资源。