3

次のようなクラスがあるとします。

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()

4

1 に答える 1