`
wsql
  • 浏览: 11716549 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

用成员函数指针作为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类的实现很简单,如下:


有了这个类,我只需要定义一个CallBack对象,并将其传给定时器即可:

  CallBack<AnimateImage> callback(aAnimageImage,&AnimateImage::UpdateImage);

   Add2Timer(callback);

   这样一来。就少了好多诸多“static 垃圾”

  也许有人会问了,你这是没有参数的情况,如果要将带参数的成员函数作为callback该怎么办呢。对于这个问题估计你得求助于boost库中的bind来完成了,这个东西可以将任意多个参数的函数变为无参数的。

分享到:
评论

相关推荐

    C++中回调函数(CallBack)的用法分析

    其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有...

    成员函数用于回调函数

    用此函数库可以将成员函数指针转为普通函数指针 测试代码如下 #include #include #include #include #include #include using cmpfunc = int(__cdecl*)(const void*, const void*); using DebugArrayFunc = ...

    BCB线程中调用主界面的回调函数

    网上的回调函数都是API例子,学习函数指针倒是不错,可是很难让初学者立即应用。常见的情况是辅线程完成某事件后需要“通知”主界面,比如常见的进度条——线程中完成一定的进度后即通知主界面显示到一定的刻度。本...

    在c和c++中实现函数回调

    将函数指针作为结构体成员,可以实现函数注册和回调 代码如下:struct T{ void (*callback)(char *);};void doSomething(char *job){ //TODO…}int main(){ T t; t.func = doSomething; //调用回调函数 t.func...

    C++回调函数的2个DEMO程序,整理修改by唐太咸

    这里面有两个运用回调函数的DEMO程序 1.其中tcCallBack的作用是希望通过将Receiver类的...2.另外一个tcFunctionTemplate是使用std::function模板和std::bind,支持全局和类成员函数作为回调函数,我在VS2010下编译通过

    LuaBind 源码 (Lua增强库)

    成员函数被视同非常量成员函数. 如果你测试了LuaBind和其他未列出的编译器的兼容性,请告诉我们你的结果. 4 构建LuaBind 为了抑制LuaBind的编译时间最好是将其编译为一个库. 这意味着你要不编译并连接LuaBind 库...

    C++中模块(Dll)对外暴露接口的几种方式

     缺点是这种方式是面向过程的,外部如果要支持多实例等不是很方便,另外它要求的回调函数(callback)只能是普通C函数,C++中我们通常用类静态成员函数,很不方便。  当然,我们通过封装其实也可以让这种方式支持...

    Delphi中制作DLL中回调函数的应用

    只要象C/C++这样支持函数指针的语言都 有回调函数的概念,它实际上是向被调用函数传一个你的函数地址,然后被调用函数向通过你传 入的函数地址来调用你的函数 。 以上是结构化回调,到高级语言Object Pascal、C++...

    事件驱动多线程网络框架

    Server类中包括了有一个重要的类叫做Eventlooper这个类就是对epoll的封装,要用epoll_ctl注册到epoll上的fd又被封装为Channel类,当有数据到来需要操作时,channel中的几个函数指针就指向了需要回调的函数, 这里...

    [原创]自己工作中常用的模板库,简化你的工作

    ★ C++语法不支持模板函数/模板成员函数作为回调函数。本库采用了封装,可以支持模板函数的回调,并且支持最多7个可变参数(可以简易扩充参数个数)。 可以遍历一个TypeList或者枚举值范围CEnumRange,然后以满足...

    最新名企标准通用C++面试题,

    如果类的成员函数是一个callback函数, 必须宣告它为"static",才能把C++ 编译器加诸于函数的一个隐藏参数this去掉。 11.C++里面是不是所有的动作都是main()引起的?如果不是,请举例。 不是的,C++里面有些...

    CPrime-old:用C语言工具生成和维护代码

    不同之处在于我们没有捕获,lambdas表达式的结果始终是指向函数的指针。 void Run ( void (*callback)( void *), void* data);int main (){ Run ([]( void * data) { printf ( " first " ); Run ([]( void * data){...

    windows编程资料大全

    调用函数GetLastInputInfo()以后, 结构成员lpi.dwTime 中的值便是自上次输入事件发生以后的毫秒数。这个值也就是键盘、鼠标处于空闲状态的时间。可惜的是这个函数只能在Windows 2000中使用,Windows 9x 或Windows ...

    基于C语言的录音播放程序--源代码

    //录音函数 simplest_pcm16le_to_wave("NocturneNo2inEflat_44.1k_s16le.pcm", 1, 44100, "output_nocture.wav"); //将二进制录音信息从内存中提取,并生成 wav 文件 测控 1602 DEV C ++ 环境下 控制台应用程序 善...

    深入浅出MFC【侯捷】

    第2章 C++的重要性质 类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 虚拟函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚拟函数 静态成员(变量与函数) ...

    深入浅出MFC 2e

    Callback函数 空闲时间(idle time)的处理:OnIdle Dialog与Control 通用对话框(Common Dialogs) 本章回顾 第7章 简单而完整:MFC骨干程序 不二法门:熟记MFC类层次结构 MFC程序的UI新风貌 Document/View支撑你的...

    侯捷- -深入浅出MFC

    Callback函数 空闲时间(idle time)的处理:OnIdle Dialog与Control 通用对话框(Common Dialogs) 本章回顾 第7章 简单而完整:MFC骨干程序 不二法门:熟记MFC类层次结构 MFC程序的UI新风貌 Document/View支撑你的...

Global site tag (gtag.js) - Google Analytics