Estoy diseñando un patrón de observador que debe trabajar de esta manera: observador llama AddEventListener
método de EventDispatcher
y pasa una cadena que es el nombre de la event
, PointerToItself y una PointerToItsMemberMethodC++ propio patrón Observador
Después de eso event
sucede dentro del EventDispatcher
; mira a través de la lista de suscripciones y, si hay algunas, asignadas a este evento llama al método action
del observer
.
He venido a este EventDispatcher.h
. PRECAUCIÓN contiene un poco de pseudocódigo.
El son dos preguntas:
- ¿Cómo definir el tipo de
action
enstruct Subscription
? - ¿Me estoy moviendo de la manera correcta?
PS: No, no voy uso boost
o cualquier otras bibliotecas.
#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);
};
Esta cabecera implementa como este en 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);
};
};
};
A malo que' No estoy usando boost, ya que eso permitiría una solución segura fácil y de tipo que superaría su enfoque actual y sería más flexible. ¿Se permiten las soluciones C++ 11? – Ylisar
Realmente no lo sé aún, ¿qué es C++ 11? Es un nuevo estándar, ¿verdad? Me pregunto si mi 'g ++' ya lo sabe. El nuevo estándar está bien para usar, no es una biblioteca ... – Kolyunya