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指针,从而实现数据成员共享。这种方法稍稍麻烦,这里就不再赘述。
例子:

代码如下:

1 #include "stdafx.h"
 2 #include
 3 #include
 4 using namespace std;
 5
 6 class Test
 7
 8 public:
 9     friend void callBackFun(void) cout << "CallBack Function!"; //因为callBackFun默认有一个const Test* 的指针
10 ;
11
12 typedef void (*FPtr)(void);
13 void Fun(FPtr ptr)
14
15     ptr();
16
17 int main(void)
18
19     Fun(callBackFun);
20
21     return 0;

Original: https://www.cnblogs.com/ybqjymy/p/16521506.html
Author: 一杯清酒邀明月
Title: C++ 回调函数(CallBack)的用法分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535304/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • c++ union内存

    看一个例子: 输出结果: 为什么是这样的呢? 因为A是union,所以在内存中存储的格式为: 高地址 ————> 低地址 12…

    C++ 2023年5月29日
    049
  • Using WebAssembly threads from C, C++ and Rust

    Learn how to bring multithreaded applications written in other languages to WebAssembly. J…

    C++ 2023年5月29日
    068
  • C/C++中static,const,inline三种关键字的总结(参照网络)

    一、 关于staticstatic 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符…

    C++ 2023年5月29日
    066
  • Emacs 设置C++代码风格

    EMACS中的C++ 代码风格设置 1 ;; C++代码风格设置 2 (defconst cobbcpp 3 ‘("linux" ; this is inher…

    C++ 2023年5月29日
    053
  • 当C++遇到iOS应用开发之—List集合

    在Object-c中,数组使用NSArray和NSMutableArray(可变长数组)。使用语法如下: NSArray *array = [[NSArray alloc] ini…

    C++ 2023年5月29日
    059
  • C++11智能指针处理Array对象

    //C++11的//完全可以避免写手动的delete代码,//但是它默认使用delete删除对象,//如果是数组对象,需要指定自定义的删除方法,支持delete[]std::sha…

    C++ 2023年5月29日
    041
  • 邻接表有向图(二)之 C++详解

    邻接表有向图是指通过邻接表表示的有向图。 上面的图G2包含了”A,B,C,D,E,F,G”共7个顶点,而且包含了” 上图右边的矩阵是G2在内存中…

    C++ 2023年5月29日
    069
  • C++中 线程函数为静态函数 及 类成员函数作为回调函数

    线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程…

    C++ 2023年5月29日
    063
  • (筆記) 如何讀取binary file某個byte的值? (C/C++) (C)

    Abstract通常公司為了保護其智慧財產權,會自己定義檔案格式,其header區會定義每個byte各代表某項資訊,所以常常需要直接對binary檔的某byte直接進行讀取。 In…

    C++ 2023年5月29日
    054
  • LLVM Constant Value to c++ value

    auto llval = b.getInt32(-1); std::cout << llval->getZExtValue() << "\n…

    C++ 2023年5月29日
    073
  • C++经典案例

    per-thread的单例模式 //单例子模式,per-thread的单例模式 IPCThreadState* IPCThreadState::self() //IPCThread…

    C++ 2023年5月29日
    056
  • 【转】C++11 新特性总结

    其他路径: CSDN: https://blog.csdn.net/wodehao0808 微信公众号:程序喵星人 更多资源和视频教程,QQ:1902686547 前言 转载请注明…

    C++ 2023年5月29日
    067
  • C++ CRTP

    CRTP 英:The curiously recurring template pattern (CRTP) is a C++ idiom in which a class X d…

    C++ 2023年5月29日
    089
  • Model/View结构(整理自<Qt5.9 C++开发指南>)

    数据模型 数据不仅可以存储在数据模型中,数据可以是其他类,文件,数据库或任何数据源. 视图组件 那些带View的类; 在显示数据时,调用setModel()函数,为自己设置一个数据…

    C++ 2023年5月29日
    064
  • C++内存管理

    [ 导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内…

    C++ 2023年5月29日
    048
  • std::get<C++11多线程库~线程间共享数据>(09):共享数据带来的问题(1)

    1 #include 2 3 /* 4 * 话题1:线程间共享数据 5 * a. 共享数据带来的问题 6 * b. 使用互斥量保护数据 7 * c. 数据保护的替代方案 8 * 9…

    C++ 2023年5月29日
    056
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球