1

C++ で単純なイベント ディスパッチャを作成しようとしています。私はこの特定の分野に非常に慣れていないので、私の無知を許してください。

ディスパッチ プロセスには、次のインターフェイスがあります。

class listener
{
    public:
       virtual void triggerEvent(int id)=0;
};

次に、それを組み込むために、単純に実装します。

class A : public listener
{
    public:
           A();
           void triggerEvent(int event);
           .
           .
           .
           B* b;
};

A オブジェクトを指す listener_ というリスナー ポインターを持つクラスでは、次のように A のイベントをトリガーできます。

 void B::method()
 {
       .
       .
       .
       listener_->triggerEvent(DO_SOMETHING); // calling point
 }

しかし、問題は、A の triggerEvent 実装が呼び出されると、B::method() が再度呼び出されるように、A にも B オブジェクトへのポインターがあることです。つまり、次のようになります。

 void A::triggerEvent(int id)
 {
      if(id==DO_SOMETHING)b->method();
 }

これにより、再帰の問題が発生します。

理想的には、B::method() の「呼び出しポイント」をスタックからすぐに解放したいと考えています。上記の再帰の問題を防ぐにはどうすればよいですか? イベント ディスパッチャーの設計で間違っている点は何ですか? どうすれば修正できますか?

編集: 上記は非常に極端な例です。実際の状況では、A は実際には何らかの「制御スレッド」である可能性があります。B は、A がさらに操作を続行できるように、終了時に制御スレッドに通知する必要がある別のアルゴリズムである可能性があります。B::method はスレッドの場合もあります。

感謝と最高の願い、

ベン。

4

1 に答える 1

0

オブザーバー パターンを実装しています。

イベント ディスパッチャーの設計で間違っている点は何ですか?

イベント ハンドラー内でイベントをトリガーするメソッドを呼び出すという事実。メソッドを呼び出さないことで修正します。

于 2012-05-23T09:16:19.580 に答える