4

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

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

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

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

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

4

3 回答 3

6

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

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

于 2013-04-12T17:15:01.767 回答
0

Scott Meyers,Effective C++ Item 15 说是的,尽管主要原因是与遗留代码的交互性。如果你在一个受控的环境中——例如一个很少有遗留代码的初创公司,并且很容易根据需要或在家庭作业中扩展一个类——可能没有什么需要,它可能只会鼓励错误地使用这个类。但更可重用的方法是公开原始资源。

于 2013-04-12T17:24:17.747 回答
0

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

返回非拥有指针是一种可接受的获取引用的方法,这些引用也可能为空,并且不再比其他方法危险。现在,在你的情况下,这只有在你的树被用作 tree 时才有意义而不是在内部使用 tree std::map

尽管通常您希望将指针和资源抽象出来,但这样做并不常见。

于 2013-04-12T17:27:38.157 回答