3

これが私の状況です:

すべてのハンドラーがIHandlerクラスから派生し、onEvent(const Event &event)メソッドを実装するイベント駆動型システムがあります。現在、Eventはすべてのイベントの基本クラスであり、列挙されたイベントタイプのみが含まれています。EventKey2つのフィールドを持つイベントを含め、すべての実際のイベントはそれから派生します:(uchar) keyCode(bool) isDown

ここに興味深い部分があります:私EventKeyは次の構文を使用してイベントを生成します:

Event evt = EventKey(15, true);

そして私はそれをハンドラーに出荷します:

EventDispatch::sendEvent(evt); // void EventDispatch::sendEvent(const Event &event);

EventDispatchのリンクリストが含まれ、送信されたイベントを含むパラメーターを使用しIHandlersてメソッドを呼び出します。onEvent(const Event &event)

さて、実際の質問:

ハンドラーにタイプのキュー内のイベントをポーリングさせたいEventとしましょう。どうすればよいですか?

  • 参照カウントを使用する動的ポインターは、ソリューションが大きすぎるように聞こえます。

  • 基本タイプへの参照しか受け取っていないため、コピーを作成するのは思ったより難しいです。したがって、イベントのタイプを確認するたびに、アップキャストしてからEventKeyコピーを作成してキューに保存する必要があります。唯一の解決策のように聞こえますが、すべての種類のイベントを知る必要があり、受信したすべてのイベントについて確認する必要があるため、不快です。悪い計画のように聞こえます。

  • イベントを動的に割り当ててから、それらのイベントへのポインターを送信し、必要に応じてそれらを配列にエンキューすることができますが、参照カウントを使用する以外に、そのメモリを追跡するにはどうすればよいですか?ユーザーの邪魔にならない非常に軽い参照カウンターを実装する方法を知っていますか?

この設計の良い解決策は何だと思いますか?

4

3 に答える 3

4

さて、最初に、この行はあなたが思っていることをしません:

Event evt = EventKey(15, true);

これにより、一時的なEventKeyオブジェクトが作成され、それが基本クラスのEventにスライスされてから、Eventコピーコンストラクターが呼び出されます。EventKeyクラスに保持されている実際のデータはすべて失われます。ポリモーフィズムが必要な場合は、動的オブジェクトまたは参照のいずれかを使用する必要があります。

実際の質問については、再設計して、イベントタイプごとに個別のキュー(したがって個別のハンドラー)を用意することをお勧めします... onEventA、onEventBなど。

于 2010-06-01T06:14:51.810 に答える
1

意見:参照カウントオプションを選択してください。boost::shared_ptrおよびboost::dynamic_pointer_castを使用して、実際のタイプを判別します。

于 2010-06-01T05:35:34.363 に答える
1

イベントオブジェクトを共有しない限り、参照カウントは実際には必要ありません。常に所有者が1人だけの場合(この場合、通常はイベントキューになります)、適切なコンテナを使用する必要があります。

実装ですでにC++0xが部分的に実装されている場合(たとえば、最近のg++バージョンやVC++ 2010)、単純にを使用できますstd::queue<std::unique_ptr<Event>>std::unique_ptr利用できない場合は、 BoostPointerContainerライブラリboost::ptr_dequeからまたはその他の適切なコンテナを使用できます。

于 2010-06-01T05:53:38.377 に答える