Jestem projektowania wzorca obserwatora, który powinien działać w ten sposób: obserwator wzywa AddEventListener
metoda EventDispatcher
i przekazuje ciąg, który jest nazwą event
, PointerToItself i PointerToItsMemberMethodC++ własne Wzorzec Obserwator
Po tym event
dzieje się wewnątrz EventDispatcher
; przegląda listę subskrypcji i jeśli są jakieś, przypisane do tego zdarzenia wywołuje metodę action
z.
Doszedłem do tego EventDispatcher.h
. UWAGA zawiera trochę pseudokodu.
są dwa pytania:
- Jak określić typ
action
wstruct Subscription
? - Czy poruszam się właściwą drogą?
PS: Nie, nie będę Użyj boost
lub żadnych innych bibliotek.
#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);
};
Nagłówek ten realizuje tak w 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);
};
};
};
Aby zły pan” nie używajmy doładowania, ponieważ pozwoliłoby to na łatwe i bezpieczne rozwiązanie, które przewyższałoby obecne podejście i było bardziej elastyczne. Czy dozwolone są rozwiązania C++ 11? – Ylisar
Jeszcze nie wiem, czym jest C++ 11 ... To nowy standard, prawda? Zastanawiam się, czy mój "g ++" już to wie? Nowy standard jest w porządku do użycia, to nie jest biblioteka ... – Kolyunya