用成员函数指针作为Callback
时间:2010-12-10 来源:李书淦
class AnimateImage:publicWidget
{
public:
virtual void UpdateImage( void );
};
由于要求定时地更新图片,应该将UpdateImage加到一个定时器之中。在以前,我会这样来做这样事:首先申明一个static的help function-- StaticUpdateImage,在这个函数中调用UpdateImage,然后将StaticUpdateImage加到定时器中.
class AnimateImage:publicWidget
{
public:
virtual void UpdateImage( void );
private:
staticvoid StaticUpdateImage(AnimateImage*pThis){pThis-> UpdateImage();}
};
我讨厌这样,因为这样增加了程序的间接性。
前几天重新温习了一下C++基础知识,才明白可以用成员函数作为callback。为了可以这样,定时器要以接受函数对象作为其参数。然后你就可以将无参的成员函数弄成一个callback。这需要一个help 类来作这件事。help类的实现很简单,如下:
/*! * Copyright (c) 2010 FengGe(CN), Inc * All rights reserved * This program is UNPUBLISHED PROPRIETARY property of FengGe(CN). * Only for internal distribution. * * @file: callBack.h * * @brief: * * @author: [email protected] * * @version: 1.0 * * @date: 2010-12-10 */ #ifndef _CALLBACK_H #define _CALLBACK_H class CallAble { public: virtual void operator() ( void ) = 0; }; template<typename T> class CallBack:public CallAble { public: typedef void (T::*fun) ( void ); CallBack(T* pCallee,fun f): m_pCallee(pCallee) ,m_funCallback(f) { } void operator() ( void ) { (m_pCallee->*m_funCallback)(); } private: T* m_pCallee; fun m_funCallback; }; #endif //CALLBACK_H
有了这个类,我只需要定义一个CallBack对象,并将其传给定时器即可:
CallBack<AnimateImage> callback(aAnimageImage,&AnimateImage::UpdateImage);
Add2Timer(callback);
这样一来。就少了好多诸多“static 垃圾”
也许有人会问了,你这是没有参数的情况,如果要将带参数的成员函数作为callback该怎么办呢。对于这个问题估计你得求助于boost库中的bind来完成了,这个东西可以将任意多个参数的函数变为无参数的。