3

「基本的に」次のような単純なイベントシステムを設計しようとしています。

  • オブザーバーエンティティは、通知が必要なすべてのオブジェクトのリストを保持します。また、発生したイベントのキューも格納します。次に、イベントはオブジェクト リストによって処理され、このオブジェクト リストを反復処理します。
  • オブジェクトは、イベントを送信するオブザーバーのリストを保持します。基本オブジェクトから継承する特定の各オブジェクトは、独自の特殊なイベント (キー、マウス、衝突など) を発生させることができます。オブジェクトには、HandleEvent(..)を使用する代わりに、コンパイル時の型検出のためのさまざまなオーバーロードを持つメソッドもありますdynamic_casting

イベントを起動するときに、どちらを選択するのが良いでしょうか: スタック上にイベントを作成して参照渡しするか、ヒープ上に動的に割り当てて dynamic_casting を使用し、それらを処理できるオブジェクトによって処理されるときにオブザーバーがそれらの割り当てを解除できるようにします。 ? (たとえば、イベントがかなり頻繁に発生する可能性がある場合、動的割り当ては不要ではありませんか?動的キャストについてはどうですか?それは避けられませんか?)。

また、これは完全にスレッドセーフなシナリオではありません..

4

1 に答える 1

2

動的割り当てが必要ですか? いいえ。通常は、

void fireEvent()
{
    Event ev;
    for ( each observer )
       observer.trigger(ev);
}

そしてオブザーバーの署名

void trigger(const Event& ev);

衒学的に言えば、「それらへの参照を渡す」ことは真実ではないことに注意してください。実際には「参照渡し」です。

于 2012-11-15T14:32:37.820 に答える