4

C++ でスマート ポインターを使用するのはこれが初めてで、理解に問題があります。ある種のコンポーネント ベースの OpenGL フレームワークを設計したいと考えています。

したがって、ノードを作成し(それ自体を格納する)Sceneクラスがあり、それをshared_ptrとして返します。Node クラスには、Node クラスで作成され、再び shared_ptr として返されるコンポーネントのリストがありますが、これらのコンポーネントには所有者 (ノード) への参照も必要であり、ノード自体がそのポインターをそのコンポーネントに渡す必要があります。

さて: コンポーネント内の Node へのポインタ、それは何であるべきでしょうか? shared_ptr または weak_ptr。ノード自体にそれを渡す方法 (ノードは、シーンに格納されている shared_ptr への参照を持っていません)

//! 編集1

class Scene
{
vector<shared_ptr<Node>>  nodes;
public:
weak_ptr<Node>  NewNode();
}

class Node
{
vector<shared_ptr<Component>> components;
public:
weak_ptr<Component> AddComponent();
weak_ptr<Component> GetComponent(String classname);
vecotr<weak_ptr<Component>> GetComponents(String classname);
}

class Component
{
weak_ptr<Node> owner;
Component(weak_ptr<Node> owner_refernce);
public:
// component stuff
weak_ptr<Node> GetOwner();
friend class Node;
}

ここで最高のデザインを作るのを手伝ってください。

// EDIT1 : より明確にするために!

シーンはノードの唯一の所有者です。それはそれらを作成し、破壊します。各ノードは、そのすべてのコンポーネントを所有しています。それはそれらを作成し、破壊します。また、コンポーネントには、他のオブジェクトと共有する所有者への参照が必要です (Get メソッドで所有者を返すことにより)。

-> シーンはノードを所有し、ノードはコンポーネントを所有します。

-> シーン共有ノード (ノード オブジェクトを名前で返す)

-> ノードはすべてのコンポーネントを共有しました (クラス名でコンポーネントを返します)

-> コンポーネントは所有者を共有します (所有者参照を返す)

所有権を共有せずにオブジェクトを共有するにはどうすればよいですか? 弱い_ptr ??

編集 2: この場合、スマート ポインターは役に立たないようです。だから私は今のところ行ポインタを使っています

4

1 に答える 1

3

あなたの説明から、Nodeインスタンスには明確な所有者(Scene)があるようです。もしそうなら、shared_ptr必ずしも最良の解決策ではありません。std::unique_ptr、または生のポインタ(必要な削除を~Scene含む)でさえ、おそらくより適切でしょう。または、おそらくBoostのポインタベクトル。同じ考慮事項がとに適用されComponentますNode。また、の親ポインタComponentは厳密にナビゲーション用であるように見えるため、生のポインタが最も適切です。

于 2013-01-24T09:59:07.523 に答える