C++ 自定义事件机制2
来源:互联网 发布:懒人眼镜 淘宝 编辑:程序博客网 时间:2024/06/14 04:15
可以使用成员函数指针,用到了类模版!
---------------------------------------------------------------
1、要定义一个事件基类,可以使用它传递不懂类型的参数。
myevent.h
#pragma once#include <iostream>#include <string>using namespace std;class MyEvent{public:MyEvent(string type);~MyEvent();string getType();protected:private:string _type;};
myevent.cpp
#include "myevent.h"MyEvent::MyEvent(string type){_type = type;cout << "MyEvent()" << endl;}MyEvent::~MyEvent(){cout << "~MyEvent()" << endl;}std::string MyEvent::getType(){return _type;}
2、然后要有一个类型和函数指针的模版类。
eventitem.h
#pragma once#include "myevent.h"#include <memory>template <typename T>class EventItem{typedef void(T::*ItemFUN)(MyEvent&);public:EventItem(){cout << "EventItem()" << endl;}~EventItem(){cout << "~EventItem()" << endl;}void (T::*f)(MyEvent&);shared_ptr<T> t;};
3、定义事件收发管理类
eventdispatcher.h
#pragma once#include <unordered_map>#include <string>#include "myevent.h"#include <iostream>#include "eventitem.h"#include <memory>using namespace std;template<typename T>class EventDispatcher{typedef void(T::*EventFun)(MyEvent&);public:static void addEventListener(string type, shared_ptr<T> t, EventFun f);static void dispatchEvent(shared_ptr<MyEvent> sp);static void removeEventListener(string type);static bool hasEventListener(string type);private:static unordered_map<string, shared_ptr<EventItem<T>>> events;};template<typename T>unordered_map<string, shared_ptr<EventItem<T>>> EventDispatcher<T>::events;template<typename T>void EventDispatcher<T>::addEventListener(string type, shared_ptr<T> t, EventFun f){if (!hasEventListener(type)){shared_ptr<EventItem<T>> spItem = make_shared<EventItem<T>>();spItem->t = t;spItem->f = f;events[type] = spItem;}else{cout << "事件 " << type << " 已经定义" << endl;}}template<typename T>void EventDispatcher<T>::dispatchEvent(shared_ptr<MyEvent> sp){string& temp = sp->getType();if (hasEventListener(temp)){shared_ptr<EventItem<T>> spItem = events[temp];((*spItem).t->*(*spItem).f)(*sp);cout << spItem->t->i << endl;}else{cout << "事件 " << temp << " 未定义" << endl;}}template<typename T>void EventDispatcher<T>::removeEventListener(string type){if (hasEventListener(type)){events.erase(type);}else{cout << "事件 " << type << " 未定义" << endl;}}template<typename T>bool EventDispatcher<T>::hasEventListener(string type){if (events[type] != nullptr){return true;}return false;}
至此就可以使用了简单吧~
===========================================================================================
使用案例:
main.cpp
#include <iostream>#include "eventdispatcher.h"#include <memory>class Test{public:int i;Test(){cout << "Test()" << endl;}~Test(){cout << "~Test()" << endl;}void test(MyEvent& e){cout << "what the hell!!!" << endl;i++;}protected:private:};void fun(){shared_ptr<Test> pt = make_shared<Test>();pt->i = 10;EventDispatcher<Test>::addEventListener("hello", pt, &Test::test);EventDispatcher<Test>::addEventListener("jj", pt, &Test::test);}void del(){EventDispatcher<Test>::removeEventListener("hello");}int main(){fun();del();system("pause");return 0;}
0 0
- C++ 自定义事件机制2
- 自定义事件机制
- C++ 自定义事件机制
- FLEX 事件机制-自定义事件
- Java事件机制---自定义事件
- Java事件机制---自定义事件
- C#事件处理机制
- C# 事件机制
- $.event.special自定义事件机制
- cocos Creator自定义事件机制
- c.sharp自定义事件
- C#-控件-自定义事件
- C#:自定义事件
- java事件处理机制—自定义事件
- Java事件处理机制-自定义事件
- java事件处理机制 自定义事件
- java事件机制及自定义事件处理
- java事件处理机制(自定义事件)
- 关于Buffered在ExtJS各版本中变化
- SVN资源同步时的图标含义
- Isomorphic Strings
- Zookeeper 00 安装
- 交你如何快速破解word限制编辑密码!
- C++ 自定义事件机制2
- UML中的关系
- UVA 1605 - Building for UN
- 接地的方法
- thinkphp 关闭debug 后报错
- cocos2d-x 调用AlertDialog.Builder报错的解决方案
- Start from Yes
- 基于NODEJS的前后端项目分离实践
- JSON风格指南-真经