zoukankan      html  css  js  c++  java
  • 用成员函数指针作为Callback

      在带类的C中呆久了,还以为callback是静态或者全局函数的专利。有时为了让一个类的成员函数可以作为callback,不得不写一个静态函数,然后在这个函数的实现里面傻傻地调用一下那个成员函数。例如AnimateImage,这是一个从Widget继承下来的UI类,用来提供一种功能,定时地显示不同的图片,它的实现像下面这样.

      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: li_shugan@126.com
     *
     * @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来完成了,这个东西可以将任意多个参数的函数变为无参数的。

  • 相关阅读:
    Android组件化框架设计与实践
    浅谈Android进阶之路
    Android APP 性能优化的一些思考
    有关 Hybrid 开发模式实践总结
    开发人员必备的技能——单元测试
    有关Android插件化思考
    人生的意义到底是什么?
    Asp.Net Core 3.1学习-读取、监听json配置文件(7)
    Asp.Net Core 3.1学习-依赖注入、服务生命周期(6)
    Asp.Net Core 3.1学习- 应用程序的启动过程(5)
  • 原文地址:https://www.cnblogs.com/li_shugan/p/1902643.html
Copyright © 2011-2022 走看看