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

 更新时间:2015年01月12日 14:57:19   投稿:shichen2014  
这篇文章主要介绍了C++中回调函数(CallBack)的用法,较为详细的分析了C++中回调函数(CallBack)的原理并以实例形式总结了其具体用法,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下:

如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。
其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员。由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C++中使用回调函数所遇到的问题。这种方法具有通用性,适合于任何C++。
  
1).   不使用成员函数,为了访问类的成员变量,可以使用友元操作符(friend),在C++中将该函数说明为类的友元即可。

2).   使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作为回调函数了。静态成员函数具有两大特点:其一,可以在没有类实例的情况下使用;其二,只能访问静态成员变量和静态成员函数,不能访问非静态成员变量和非静态成员函数。由于在C++中使用类成员函数作为回调函数的目的就是为了访问所有的成员变量和成员函数,如果做不到这一点将不具有实际意义。解决的办法也很简单,就是使用一个静态类指针作为类成员,通过在类创建时初始化该静态指针,如pThis=this,然后在回调函数中通过该静态指针就可以访问所有成员变量和成员函数了。

这种处理办法适用于只有一个类实例的情况,因为多个类实例将共享静态类成员和静态成员函数,这就导致静态指针指向最后创建的类实例。为了避免这种情况,可以使用回调函数的一个参数来传递this指针,从而实现数据成员共享。这种方法稍稍麻烦,这里就不再赘述。
例子:

复制代码 代码如下:
#include "stdafx.h" 
#include <iostream> 
#include <assert.h> 
using namespace std; 
 
class Test 

public: 
    friend void callBackFun(void){ cout << "CallBack Function!";} //因为callBackFun默认有一个const Test* 的指针 
}; 
 
typedef void (*FPtr)(void); 
void Fun(FPtr ptr) 

    ptr(); 

int main(void) 

    Fun(callBackFun);  
 
    return 0; 
}

希望本文所述对大家的C++程序设计有所帮助。

相关文章

  • C/C++实现监控目录文件变化

    C/C++实现监控目录文件变化

    ReadDirectoryChangesW是Windows操作系统提供的一个函数,用于监视目录的变化,本文主要为大家介绍了如何使用ReadDirectoryChangesW实现监控目录文件变化,需要的可以参考下
    2023-11-11
  • C/C++开发中extern的一些使用注意事项

    C/C++开发中extern的一些使用注意事项

    这篇文章主要为大家介绍了C/C++开发中extern一些使用注意事项的事例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • C语言函数超详细讲解上篇

    C语言函数超详细讲解上篇

    函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数,函数我们分两篇来讲解,接下来开始第一篇
    2022-04-04
  • C++ throw关键字实现抛出异常和异常规范

    C++ throw关键字实现抛出异常和异常规范

    本文主要介绍了C++ throw关键字实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言实例真题讲解数据结构中单向环形链表

    C语言实例真题讲解数据结构中单向环形链表

    链表可以说是一种最为基础的数据结构了,而单向链表更是基础中的基础。链表是由一组元素以特定的顺序组合或链接在一起的,不同元素之间在逻辑上相邻,但是在物理上并不一定相邻。在维护一组数据集合时,就可以使用链表,这一点和数组很相似
    2022-04-04
  • C++中sort函数的基础入门使用教程

    C++中sort函数的基础入门使用教程

    这篇文章主要给大家介绍了关于C++中sort函数的基础入门使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-12-12
  • c语言实现简易版三子棋(附完整代码)

    c语言实现简易版三子棋(附完整代码)

    大家好,本篇文章主要讲的是c语言实现简易版三子棋(附完整代码),感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Qt使用QCustomPlot的实现示例

    Qt使用QCustomPlot的实现示例

    QCustomPlot是一个基于Qt C++的图形库,用于绘制和数据可视化,并为实时可视化应用程序提供高性能服务,本文主要介绍了Qt使用QCustomPlot的实现示例,感兴趣的可以了解一下
    2024-01-01
  • 基于C++写一个推箱子小游戏

    基于C++写一个推箱子小游戏

    这篇文章主要为大家详细介绍了基于C++写一个推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-09-09
  • C语言实现新生入学登记系统

    C语言实现新生入学登记系统

    这篇文章主要为大家详细介绍了C语言实现新生入学登记系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论