次のようなクラスがあるとします。
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
// 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()