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])();}

原创粉丝点击