我有一个具有unique_ptr成员的类,此类保留此对象的唯一所有权。但是,外部类可能需要访问此对象。在这种情况下,我应该只返回一个原始指针吗? shared_ptr似乎不正确,因为这意味着访问类现在共享该内存的所有权,而我想明确表示原始类是唯一的所有者。
例如,也许我有一个拥有根节点的树类。另一个类可能希望由于某种原因探索树,并且需要指向根节点的指针来执行此操作。部分实现可能如下所示:
class Tree
{
public:
Node* GetRoot()
{
return m_root.Get();
}
private:
std::unique_ptr<Node> m_root;
};
这是不好的做法吗?什么是更好的解决方案?
答案 0 :(得分:6)
更常规的实现可能是Tree
公开迭代器或提供visit
机制来探索树,而不是暴露Tree
本身的实现细节。公开实现细节意味着您永远不能更改树的底层结构,而不会有破坏该代码的知道多少客户端的风险。
如果您绝对坚持需要这样做,至少将指针返回const
,例如const Node* GetRoot() const
,因为外部客户端绝对不应该改变树结构。
答案 1 :(得分:0)
Scott Meyers, Effective C ++ 第15项说是,尽管主要原因是与遗留代码进行交互。如果您处于受控环境中 - 例如一个没有遗留代码的创业公司,可以根据需要或在家庭作业中轻松扩展课程 - 可能没有什么需要,它可能只会鼓励错误地使用课程。但更可重用的方法是暴露原始资源。
答案 2 :(得分:0)
请记住,当人们说“避免使用指针”时,他们的意思是“使用所有权语义”,并且指针本身并不坏。
返回非拥有指针是获取引用的可接受方式,这些引用也可能为null并且不会比替代方法更危险。现在,在您的情况下,只有在您的树用作树时才会有意义,而不是像std::map
那样在内部使用树。
这种做法并不常见,因为通常你会希望抽象出指针和资源。