2017-09-16 10 views
0

この質問に間違った方法で質問しているかもしれませんが、オブジェクトのインスタンス化でメンバーコンテナを定義したいと考えています。私はこの問題を回避することができコンストラクトで定義されたC++コンテナ

namespace GUI { 

class MenuNode { 
    template <typename TMenuItem> 
    struct MenuItem{ 
     TMenuItem *text; 
    }; 
    MenuItem<unknown> t;//The member where I want the container 
         //to be defined upon construction 
public: 
    std::vector<MenuNode*> forward; 
    MenuNode* parent; 
    MenuNode(); 
    ~MenuNode(); 
}; 
} 

一つの方法は、MenuNodeテンプレートクラス自体にすることですが、私は必要なのコンテナ(リンクリストスタイル)で前方と後方ポインタを持っているだろうと私はどちらか彼らのコンテナタイプを知ることができません!

namespace GUI { 
template<class MenuItem> 
class MenuNode { 
    MenuItem t; 
public: 
    std::vector<MenuNode<unknown>*> forward; //Here I wouldn't know 
               //what the container will 
               //even be! 
    MenuNode<unknown>* parent;  //same with this member 
    MenuNode(); 
    ~MenuNode(); 
}; 
} 

だから、代わりにかかわらず、メンバーのコンテナ

namespace GUI { 
template<class MenuItem> 
class MenuNode { 
    MenuItem t; 
public: 
    std::vector<void*> forward; 
    void* parent;  
    MenuNode(); 
    ~MenuNode(); 
}; 
} 

のアドレスを指す可能性がポインタ型を有することになる。しかし、ボイドポインタの問題は、私は私が決めるだろうかわからないですオブジェクトが保持しているコンテナのタイプ私は空ポインタを使用したことがない!

非常によく似た関数(同じ名前)を持つMenuItemを作成する場合、voidポインタを使用することができれば、voidポインタへの逆参照によってそれらを呼び出すことができます。

+0

代わりに、[std :: any](http://en.cppreference.com/w/cpp/utility/any)を使用している場合は、C++ 17や 'boost :: any' ifあなたではない。前もってすべての型を知っているなら 'std :: variant'(C++ 17)と' boost :: variant'もあります。 – Jonesinator

答えて

1

抽象基本クラスを作成します。ここでスケッチです:

class MenuNodeBase { 
    std::vector<MenuNodeBase *> forward; 
    MenuNodeBase *parent; 
    virtual ~MenuNodeBase() = default; 
}; 

template<class T> 
class MenuNode : public MenuNodeBase { 
    MenuItem<T> t; 
}; 

あなたは具象クラスの機能にアクセスするには、仮想関数やdynamic_castを使用することができます。

+0

@MooingDuck:回答が投稿された直後に編集すると、ここで起こったような、投稿との編集の競合に遭遇します。 –

関連する問題