私はこのように動作するはずですオブザーバーパターンを設計しています:観察者はC++自身のObserverパターン
EventDispatcher
のAddEventListener
メソッドを呼び出し、event
の名前である文字列を渡し、PointerToItselfとPointerToItsMemberMethodその後、event
はEventDispatcher
の内部で発生します。サブスクリプションのリストを調べ、ある場合には、このイベントに割り当てられ、のaction
メソッドを呼び出します。
私はこれに来ましたEventDispatcher.h
。 注意には擬似コードのビットが含まれています。
ザ・は二つの質問です:私はstruct Subscription
にaction
のタイプを定義するにはどうすればよい
- ?
- 正しい方法で動いていますか?
PS:いいえ、私はつもり利用boost
または任意の他のライブラリではありませんよ。
#pragma once
#include <vector>
#include <string>
using namespace std;
struct Subscription
{
void* observer;
string event;
/* u_u */ action;
};
class EventDispatcher
{
private:
vector<Subscription> subscriptions;
protected:
void DispatchEvent (string event);
public:
void AddEventListener (Observer* observer , string event , /* u_u */ action);
void RemoveEventListener (Observer* observer , string event , /* u_u */ action);
};
このヘッダはu_uは、例えば、関数ポインタとすることができる最も単純な形式でEventDispatcher.cpp
#include "EventDispatcher.h"
void EventDispatcher::DispatchEvent (string event)
{
int key = 0;
while (key < this->subscriptions.size())
{
Subscription subscription = this->subscriptions[key];
if (subscription.event == event)
{
subscription.observer->subscription.action;
};
};
};
void EventDispatcher::AddEventListener (Observer* observer , string event , /* */ action)
{
Subscription subscription = { observer , event , action);
this->subscriptions.push_back (subscription);
};
void EventDispatcher::RemoveEventListener (Observer* observer , string event , /* */ action)
{
int key = 0;
while (key < this->subscriptions.size())
{
Subscription subscription = this->subscriptions[key];
if (subscription.observer == observer && subscription.event == event && subscription.action == action)
{
this->subscriptions.erase (this->subscriptions.begin() + key);
};
};
};
あなたは」 - 次の例を追加しました(あなたは、もはや存在しないオブジェクトを参照しないことに注意しなければならない可能ただ1つのサブスクリプションが、アイデアを説明する必要があります):
編集しますブーストを使用しないでください。これは、現在のアプローチより優れた柔軟性を備えた簡単で安全なソリューションを可能にするからです。 C++ 11のソリューションは許可されていますか? – Ylisar
私はまだ実際には分かっていませんが、C++ 11は何か...新しい標準ですね。もし私の 'g ++ 'が既にそれを知っていれば、私は疑問に思いますか?新しい標準は使用するのに大丈夫ですが、ライブラリではありません。 – Kolyunya