文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>用成员函数指针作为Callback

用成员函数指针作为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来完成了,这个东西可以将任意多个参数的函数变为无参数的。

 

相关阅读 更多 +
排行榜 更多 +
野生恐龙射击生存安卓版

野生恐龙射击生存安卓版

飞行射击 下载
战场狙击手

战场狙击手

飞行射击 下载
1v1布娃娃射击安卓版

1v1布娃娃射击安卓版

飞行射击 下载