2011-12-03 12 views
1

私には問題があります。私はC++でそれにアプローチする方法がわかりません。基底クラスへのポインタとインスタンスの実際の型を決定する方法

私はそれぞれ異なるアクションを実行できる3つのオブジェクトを持っています。これらのオブジェクトは、実行可能なアクションに追加されるアドオンオブジェクトをサポートします。追加されるオブジェクトに応じて、アドオンは異なるアクションを有効にします。

これをC++でどのようにモデル化できますか?

私はクラスA、B、C、AddOn1、AddOn2を持ちたいと思っています。

問題がある:

どうAddOn1/2は、(他の言葉でそれがどのように)のタイプは、それが添付されているオブジェクト何(知っている)、それに含まれるどのようなアクションを実行時に知っているのですか?

クラスA、B、Cはどのようなタイプのアドオンを持っているのですか?

私は

クラスA { ... アドオン*アドオンのような何かをしたいと思います。 };

そして、そのポインタを使ってアドオンを操作してください。しかし、その関数を使用できるようにするには、そのクラスにキャストする必要があります。

どのように私はhasAddOn1とhasAddOn2のようなブール値フィールドを持ち、これらの設定に基づいてキャストすることができます。 AddOn基本クラスでは、その親へのポインタを持ち、親に質問してAddOnの型を調べることができました。

これは意味がありますか?

答えて

2

私はそれぞれ異なるアクションを実行できる3つのオブジェクトを持っています。これらのオブジェクトは、実行可能なアクションに追加されるアドオンオブジェクトをサポートします。追加されるオブジェクトに応じて、アドオンは異なるアクションを有効にします。

なぜ継承とテンプレートを使用しないのですか?

struct A { 
    virtual void action_foo(); // virtual not really needed in this example 
}; 

struct B { 
    virtual void action_bar(); 
}; 

template<class base_t> 
struct AddOn1 : base_t { 
    virtual void action_baz(); 
}; 

void func(A& a) { 
    a->action_foo(); 
} 

// example of use 

A x; 
B y; 
AddOn1<A> z; // add on to A 
x.action_foo(); 
y.action_bar(); 
z.action_baz(); 
func(x); 
func(z); 
関連する問題