用成员函数指针作为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++中,可以使用函数指针成员函数作为参数传递给其他函数。这通常用于回调函数和事件处理程序等场景。 要将成员函数作为函数指针传递,需要将成员函数的地址作为其名称的一部分传递给其他函数。这可以通过使用成员函数的名称和括号操作符来完成。 以下是一个示例代码,展示了如何将成员函数作为函数指针传递给其他函数: ```cpp class MyClass { public: void myMemberFunction() { // 成员函数的实现 } }; void handleEvent(void (*callback)(void)) { // 回调函数的实现 // 将成员函数作为回调函数的参数传递给其他函数 MyClass obj; callback(&obj, &MyClass::myMemberFunction); } ``` 在上面的代码中,`handleEvent`函数接受一个函数指针作为参数,该函数指针指向一个回调函数。`handleEvent`使用成员函数的名称和括号操作符获取其地址,并将该地址传递给回调函数。 请注意,要正确地传递成员函数作为函数指针,必须使用适当的类名和成员函数的限定符(`&MyClass::myMemberFunction`)。在回调函数中,可以使用类实例和成员函数的地址来调用该成员函数。 此外,如果要将多个成员函数作为函数指针传递给其他函数,可以将它们存储在一个数组中,并使用适当的方式传递给其他函数。在处理多个成员函数时,可以使用指向函数的指针数组或lambda表达式等其他方式来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值