C++类的成员函数回调

静态函数或者全局函数回调

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值