假设我有这样的课程:
class Node {
public:
Node(Node* parent = 0) : mParent(parent) {}
virtual ~Node() {
for(auto p : mChildren) delete p;
}
// Takes ownership
void addChild(Node* n);
// Returns object with ownership
Node* firstChild() const;
// Does not take ownership
void setParent(Node* n) { mParent = n; }
// Returns parent, does not transfer ownership
Node* parent() const { return mParent; }
private:
list<Node*> mChildren;
Node* mParent;
};
我现在想使用智能指针和/或右值引用来指示所有权在哪里转移和不转移。
我的第一个猜测是更改mChildren
为包含unique_ptr
s,如下调整函数签名。
// Takes ownership
void addChild(unique_ptr<Node> n);
// Returns object with ownership
unique_ptr<Node>& firstChild() const;
// Does not take ownership
void setParent(Node* n) { mParent = n; }
// Returns parent, does not transfer ownership
Node* parent() const { return mParent; }
现在,当我需要将结果传递Node::firstChild()
给观察它但不获取所有权的函数时,这将是一种问题,因为我需要显式调用.get()
,unique_ptr
据我所知,不建议这样做。
什么是正确和推荐的方式来指示所有权使用unique_ptr
而不必求助于使用.get()
和传递裸指针?