2011-12-24 19 views
1

私は、ゲームプロジェクトのさまざまなシングルトンマネージャー間で使用されるイベントベースのメッセージングシステムを作成しています。次のようにすべてのマネージャタイプ(InputManager、AudioManager、など)、メッセージの処理を容易にするために、ベース・マネージャークラスから派生し、またEventHandlerクラスから継承される:抽象クラスへの型キャスト?

他の場所
class Manager 
{ ... } 

class EventHandler 
{ ... 
    virtual void onEvent(Event& e) =0; 
    ... 
} 

class InputManager : public Manager, public EventHandler 
{ ... 
    virtual void InputManager::onEvent(Event& e); 
    { ... } 
} 

IすべてのEventHandlerを追跡EventManagerを有します複数の受信者にイベントをブロードキャストするために使用されます。私はシングルトンマネージャのすべてを初期化していたときに

class EventManager 
{... 
    addHandlerToGroup(EventHandler& eh); 
    { ... } 
... 
} 

は当然のことながら、私は彼らがEventManagerのリストに作成されているとして、それらを追加することにしたいです。私の問題は、MVC++がコンパイル時に不平を言うことです。私は次のようにそれが働くだろうと思った:

int main() 
{ ... 
    EventManager* eventM = new EventManager(); 

    ... 

    InputManager* inputM = new InputManager(); 
    eventM->addHandlerToGroup(dynamic_cast<EventHandler>(inputM)); 

} 

コンパイラ、しかし、「抽象クラスへのキャストが許可されていません。」と私に知らせます私はあなたができることの印象を受けていました...結局のところ、ポリモーフィズムは、それらが解釈される基底クラスにどれほど近づいているかに関して少しの柔軟性をもってオブジェクトを前後に渡すことなく、あなたをあまり良くしません。私の現在の回避策は次のようになります。

int main() 
{ ... 
    EventManager* eventM = new EventManager(); 
    EventHandler* temp; 

    ... 

    InputManager* inputM = new InputManager(); 
    temp = inputM; 
    eventM->addHandlerToGroup(*inputM); 

} 

どの、私の知る限り、もう少し詳細なとあまり直感的な場合、私は、達成しようとしている何のために概念的に同じです。多態性の型キャスティングがどのように機能するかについては、私は完全にオフですか?どこが間違っていますか? EventManager

+0

[C++のこのような "インタフェース"](http://stackoverflow.com/questions/318064/how-do-you-declare-an-interface-in-c) – ZagNut

+0

"dynamic_cast (inputM)); '"なぜ 'dynamic_cast'ですか? – curiousguy

+0

@curiousguy正直言って、それは私が試した様々なキャストの最後でした。私は派生から基本に行くので、概念的には、私はstatic_castが私が使用するものだと考えました。それがうまくいかなかったとき、私は絶望の中で他のタイプキャストを繰り返しました。 – ketura

答えて

3

は、単にキャストを削除し、その後、

void addHandlerToGroup(EventHandler* handler); 

の方法addHandlerToGroupを宣言します。それはのAddHandlerメソッドにそのまま(例inputMで)ポインタを渡し、そしてあなたは:)

+0

私はおとなしいでしょう。まあ、私はinterwebsの答えを見つけることができなかったのも不思議ではありません。私は多型性と型キャストの伝承を探していましたが、それは* /&のハングアップでした。私はそれがあったと思った時もそうだった。本当にありがとう! – ketura

4
InputManager* inputM = new InputManager(); 
eventM->addHandlerToGroup(dynamic_cast<EventHandler>(inputM)); 

私はあなたがちょうどあなたが何をしていたのトラックを失ったと思う問題ないはずです。このコードではinputMInputManager*で、EventHandlerにキャストしようとしています。つまり、ポインタを別のクラスのインスタンスにキャストしようとしています。それはもちろん、意味をなさない。

派生クラスのインスタンスへのポインタを、その基本クラスの1つのインスタンスへのポインタにキャストできます。私はそれがあなたがすることを意図したものだと思います。

+0

説明をありがとう。それがすべてになると、常にポインターの私の理解-_- – ketura