मैं एक पर्यवेक्षक पैटर्न जो इस तरह से काम करना चाहिए डिजाइनिंग हूँ: और पर्यवेक्षक कॉल EventDispatcher
की AddEventListener
विधि और एक स्ट्रिंग जो event
का नाम है गुजरता है, PointerToItself एक PointerToItsMemberMethodसी ++ खुद पर्यवेक्षक पैटर्न
उसके बाद event
EventDispatcher
के अंदर होता है; यह सब्सक्रिप्शन की सूची देखता है और यदि कुछ हैं, तो इस घटना को सौंपा गया observer
की विधि को कॉल करता है।
मैं इस EventDispatcher.h
पर आया हूं। सावधानी में छद्म कोड का थोड़ा सा हिस्सा है।
दो प्रश्न हैं:
- मैं
struct Subscription
मेंaction
के प्रकार कैसे परिभाषित करते हैं? - क्या मैं सही तरीके से आगे बढ़ रहा हूं?
पुनश्च: नहीं, मैं नहीं उपयोग करने वाले 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);
};
};
};
बुरा करने के लिए आप ' बूस्ट का उपयोग नहीं कर रहे हैं, क्योंकि इससे एक आसान और प्रकार का सुरक्षित समाधान हो सकता है जो आपके वर्तमान दृष्टिकोण को बेहतर प्रदर्शन करेगा और अधिक लचीला होगा। क्या सी ++ 11 समाधानों की अनुमति है? – Ylisar
मुझे अभी तक वास्तव में पता नहीं है, सी ++ 11 क्या है ... यह एक नया मानक है, है ना? मुझे आश्चर्य है, अगर मेरा 'जी ++' पहले से ही जानता है? नया मानक उपयोग करने के लिए ठीक है, यह लाइब्रेरी नहीं है ... – Kolyunya