0

抽象化に関する以前の質問に続いて別の質問があります。作成されたイベントでのデータの設定に関して別の問題があります。

現状では、任意のタイプのイベントを作成し、そのデータを問題なく適用できます (変更されたバージョンの戦略設計パターンを使用)。問題は、現在、作成時にイベントにデータを渡す必要があることです。

IEvent* newEvent = new SpeedEvent( eventID, interpolation, 50.0f );

また

IEvent* newEvent = new AnimationEvent( eventID, interpolation, &newAnimation );

この方法は、オブジェクトの作成時にデータが何であるかがわかっている場合には問題ありませんが、インスタンス化するとデータがどのようなものになるかがわからない場合が多くあります。

理想的なのは、次のような新しいイベントを作成することです。

IEvent* newEvent = new SpeedEvent( eventID, interpolation );

次に、この方法でデータを割り当てます。

eventManager->assignData( eventID, *unknown data type* );

このようにして、オブジェクトが独自の方法でデータを処理できるようにします。この問題を解決する方法についての提案は大歓迎ですが、できればテンプレートの使用は避けたいと思っています。

現在のデータとオブジェクトの構造は、前の質問への回答で提案されたものと非常によく似ています。

4

2 に答える 2

1

Boost.Anyを使用して不明なデータを転送できます。ソース サイトでは単に代入を使用し、シンク サイトでは any_cast を使用して値を回復します。

少しコードを編集します。

boost::any を不明なデータ型として使用し、値を (具体的な型で) 割り当てます。具体的な型が必要な側では、any_cast を使用します。

class EventManager {
  //...
public:
  void asignData(std::size_t eventId, boost::any value);
  boost::any getData(std::size_t eventId) const;
};

eventManager->assignData( eventId, 12);  // assignes an int
eventManager->assignData( eventId, 12.0);  // assignes an double


int value1=boost::any_cast<int>(eventManager->getData(eventID)); // gets an int
double value2=boost::any_cast<double>(eventManager->getData(eventID)); // gets a double
于 2013-02-27T09:25:50.097 に答える
0

データに制限がない場合はvoid *、データ型として古き良きものを使用してください。具体的なハンドラー内で、ハンドラー内で認識されている正しい型にキャストします。

データに制限を加えたい場合は、データ仕様の概要を示すインターフェース/ベースを定義し、可能な具体的なデータ型ごとにそれを継承します。派生型のデータをジェネリック ハンドラー (基本クラスへのポインターを受け入れる) に送信します。ハンドラー内では、データ用に定義したパブリック インターフェイスを使用するか、単純に具象型にキャストできます。

于 2013-02-27T09:23:53.630 に答える