Sto progettando un pattern Observer che dovrebbe funzionare in questo modo: osservatore chiama AddEventListener
metodo EventDispatcher
e passa una stringa che è il nome del event
, PointerToItself e PointerToItsMemberMethodC++ proprio Observer modello
Successivamente, lo event
si verifica all'interno dello EventDispatcher
; guarda l'elenco degli abbonamenti e se ce ne sono alcuni, assegnato a questo evento chiama il metodo action
dello observer
.
Sono arrivato a questo EventDispatcher.h
. ATTENZIONE contiene bit di pseudo-codice.
L'sono due domande:
- Come faccio a definire il tipo di
action
instruct Subscription
? - Sto spostando nel modo giusto?
PS: No, io non sono gonna utilizzare boost
o qualsiasi altre librerie.
#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);
};
Questo collettore implementa simili in 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);
};
};
};
Per male si' Non usare boost, dal momento che ciò consentirebbe una soluzione facile e sicura del tipo che supererebbe l'approccio attuale e sarebbe più flessibile. Sono consentite le soluzioni C++ 11? – Ylisar
Non lo so ancora, cos'è C++ 11 ... È un nuovo standard, giusto? Mi chiedo se il mio 'g ++ 'lo sa già? Il nuovo standard è ok da usare, non è una libreria ... – Kolyunya