0

私は次のタイプを持っています:

typedef std::vector<Node> Nodes;
struct Top: public Nodes {};
struct Middle: public Nodes {};
struct Bottom: public Nodes {};

ここで、私のテストクラスが次のNodesオブジェクトを作成するとし_standardNodesます。

TestDifferentTypes(): _standardNodes(standardNodes(_model)) 
{
}

ノードに保存されているデータで初期化されるTopのインスタンスを作成するにはどうすればよいですか?

4

3 に答える 3

2

vector を継承することはお勧めできません。is-a ではなく、has-a 関係が必要です。を持つclass NodeStoreを使用し、そこから他のすべての Node クラスを継承します。 std::vectorNode

次に、必要な各オブジェクト型を受け入れる適切なコンストラクターを (これらのクラスごとに) 記述します。次のようになります。

class NodeStore {
    std::vector<Node> m_nodes;

    std::vector<Node>& getNodes() { return m_nodes; }
}

class TopNode {
  TopNode ( NodeStore& store ): m_nodes(store.getNodes()) 
  {
  }

}
于 2013-01-28T10:51:36.450 に答える
0

コンテナー型からの継承は一般的に回避されます (たとえば、デストラクタは仮想として宣言されていないため、ポリモーフィズムに注意する必要があります)。代わりにコンポジションを優先する必要があります。

ただし、質問に答えるにTopは、適切な基本クラスのコンストラクターを呼び出す適切なコンストラクターを定義する必要があります。

struct Top : public Nodes {
    Top(const Nodes &rhs) : Nodes(rhs) {}
    ...
};
于 2013-01-28T10:50:57.153 に答える
0

Nodesand TopMiddleand の使用法を示していませんBottomが、見た目からすると、いくつかの理由から、これを機能させることはできないと思います。

最も重要な理由は単純です: astd::vector<Node>はタイプ のオブジェクトのみを含むことができますNodeTopタイプ、 のオブジェクトは、挿入するMiddleBottomスライス ( に変換Node) されるため、派生型が失われます。

そしてstruct Top : public std::vector<Top>、不完全な型に対してベクトルをインスタンス化することはできず、インスタンス化されていないテンプレートから派生させることはできないため、次のようなことはできません(それがあなたが望むことだとは思いません)。

The usual solution for this is to create a Tree class, and use std::vector<Node*> in the nodes (as a member, not via inheritance). Alternatively, you can use Boost's pointer vector (but be careful of lifetime of the objects), or if you know that you'll never need back pointers, you can use std::vector<std::unique_ptr<Node>> (but the interface becomes a little trickier, and you still need to be careful about the lifetime of objects—removing an object from the tree will destroy it).

于 2013-01-28T11:00:21.240 に答える