ich einen Beobachter Muster bin der Gestaltung, die auf diese Weise funktionieren sollte: Beobachter AddEventListener
Methode der EventDispatcher
aufruft und eine Zeichenfolge, die den Namen des event
ist, PointerToItself und ein PointerToItsMemberMethodC++ Eigene Observer Pattern
Danach passiert event
innerhalb der EventDispatcher
; Es sieht durch die Liste der Abonnements und wenn es einige gibt, die diesem Ereignis zugewiesen sind, ruft die action
Methode der observer
.
Ich bin zu diesem EventDispatcher.h
gekommen. VORSICHT enthält ein Bit Pseudo-Code.
Das sind zwei Fragen:
- Wie kann ich die Art von
action
instruct Subscription
definieren? - Bewege ich den richtigen Weg?
PS: Nein, ich werde nicht Gebrauch boost
oder keine andere Bibliotheken.
#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);
};
Dieser Header implementiert wie dies 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);
};
};
};
Um schlecht Sie‘ Verwenden Sie keinen Boost, da dies eine einfache und typsichere Lösung ermöglicht, die Ihren derzeitigen Ansatz übertrifft und flexibler ist. Sind C++ 11-Lösungen erlaubt? – Ylisar
Ich weiß noch nicht wirklich, was C++ 11 ist ... Es ist ein neuer Standard, oder? Ich frage mich, ob mein 'g ++' es schon weiß? Neuer Standard ist in Ordnung, es ist keine Bibliothek ... – Kolyunya