オブジェクトが他のオブジェクトによってブロードキャストされたイベントをサブスクライブし、そのイベントがブロードキャストされたときにメソッドを呼び出すことができるイベント処理システムを作成しようとしています。と呼ばれるシングルトンクラスでこれを実装しようとしていEventHandler
ます。EventHandler
オブジェクトは、特定のオブジェクトによってブロードキャストされるイベントにサブスクライブするパブリックメソッドを呼び出します。
void startWatchingObjectEvent(PDObject * object, PDEvent event, PDObject* listener, PDReceiver receiver);
PDObject
は、によって処理されるすべてのオブジェクトの基本クラスですEventHandler
。PDEvent
イベントを識別する単純な一意の文字列です。
PDReceiver
私が問題に直面しているところです。PDObject
クラスのメソッドポインタにtypedefしました:
typedef void (PDObject::*PDReceiver)(PDObject*, PDEvent);
これで、クラス自体には実際に呼び出すPDObject
メソッドはありませんが、willの派生クラスがあり、の派生クラスに適用できる格納可能なジェネリック型を作成したいと思いました。私はこの方法を実装し、単体テストを作成して、正常に機能していることを確認しました。EventHandler
PDObject
EventHandler
PDObject
EventHandler
const PDEvent Test_PokeEvent = "Test_PokeEvent";
void Test_EventHandler_sendObjectMessage()
{
EventHandler& eventh = EventHandler::instance();
Test_PDObject caster;
Test_PDObject listener;
PDReceiver receiver = &Test_PDObject::test_poke;
eventh.startWatchingObjectEvent(&caster, Test_PokeEvent, &listener, (listener.*receiver)(&caster, Test_PokeEvent));
eventh.sendObjectEvent(&caster, Test_PokeEvent);
assert(listener.test_wasPoked());
}
Test_PDObject
は、が呼び出されたときに少しPDObject
反転する派生クラスです。wasPoked
test_poke
問題は、がのメソッドとして定義されているため、コンパイラがのメソッドをTest_PDObject
タイプに割り当てようとすることを好まないことです。PDReceiver
PDReceiver
PDObject
私がやろうとしていることは可能ですか?このジェネリックメソッドポインタ型を使用して、派生クラスのメソッドを参照できますか?それとも私のアプローチは完全に欠陥がありますか?
編集:次static_cast
のように、派生クラスのメソッドポインターを基本クラスのメソッドポインターにキャストするために使用できることがわかりました。
PDReceiver receiver = static_cast<PDReceiver>(&Test_PDObject::test_poke);
そしてこれまでのところとても良いです!私の単体テストは現在完全に機能しています。