C++类的成员函数回调
来源:互联网 发布:全景视频制作软件 编辑:程序博客网 时间:2024/05/29 10:46
静态函数或者全局函数回调
在C++的类中,对于静态成员函数的回调很简单,直接输入静态函数的函数地址即可,当需要调用的时候,直接通过类名与函数名即可完成调用。
类的非静态成员函数回调
对于类的非静态成员函数,由于需要指定当前函数被哪个对象调用(this),所以对于类的非静态成员函数的回调,我们需要保持当前的this指针和需要回调的函数地址。
1. 首先,由于需要保持任意的类,而且各个类之间没有任何关联,所以使用模板类来进行该类的对象保持。
T* mObj;
2. 对于回调的函数,需要保持函数的地址,比如我这需要回调的函数入参为空,返回值为bool,所以:
typedef bool (T::*EventCallBack)();EventCallBack mEventBack;
3. 当最后需要调用时,直接通过 mObj去调用函数地址即可:
(mObj->*mEventBack)();
上述则是对非静态成员函数的回调,对于GUI系统中用的比较多,同时也可以直接使用第三方库sigc++等实现。
以下则是我基于我的GUI系统实现的函数回调:
1. 类中注册回调事件处理函数:
mCursor->registerEvent(MOUSE_MOVE, &MainView::onButtonDownBk, this);
2. 保存注册回调函数:
/* *event call back */template<class T>void registerEvent(EventState state, bool (T::*eventBack)(), T* obj){if (mEventSlot.find(state) == mEventSlot.end()){mEventSlot[state] = new EventSlot<T>(eventBack, obj);}}std::map<EventState, EventSlotBase*> mEventSlot;
3. 回调函数的实现:
class EventSlotBase{public: virtual ~EventSlotBase() {};virtual bool operator()() = 0;};template<class T>class EventSlot : public EventSlotBase{public:typedef bool (T::*EventCallBack)();EventSlot(EventCallBack eventBack, T* obj){mEventBack = eventBack;mObj = obj;}virtual bool operator()(){return (mObj->*mEventBack)();}private:EventCallBack mEventBack;T* mObj;};
4. 注册函数的调用:
if (mEventSlot.find(state) != mEventSlot.end()){(*mEventSlot[state])();}
- C++:类的成员函数
- 【day0404 C++】类的成员函数
- 【c++】类的静态成员函数
- C++:面向行的类成员函数
- 3.2类的成员函数【C++】
- <C++>9.类成员函数的定义
- 玩弄C++:回调一个类成员函数
- C++类的成员函数回调
- 【C/C++】类成员函数地址的获取及使用方法
- C++:静态类成员函数
- 类成员函数回调
- 类的成员函数
- 类的成员函数
- 类的成员函数
- 类的成员函数
- 类的成员函数
- 类的成员函数
- C++Pirmer 类的成员函数和重载
- java--简易计算器图形实现
- VS中常用C#代码段快速输入总结
- Android图形缓冲区分配过程源码分析
- 两种方法求最大公约数和最小公倍数
- Round #203 (Div. 2) A------TL
- C++类的成员函数回调
- [设计模式]002-设计模式之策略模式Strategy
- GCC编译选项
- 批处理文件(.bat文件)
- 图论500题
- 关于 库文件的一些认识
- JabRef中文手册
- poj 图论题目分类
- 试论【结构体】与【共同体】