回调函数
前提是无法直接获取对象的非静态函数。
只能通过一个对象来调用,该对象的非静态函数。
想想也有道理,如果函数中使用了非静态成员,那么在回调中没法体现访问的是哪个对象的成员。
实现依赖
一个回调函数类
类中需要有一个作为函数对象的成员。
需要将计划被调用的函数bind到这个函数对象上。
一个用于创建对象(回调类)指针的静态函数成员
每注册一个回调函数,就会创建一个回调类
一个C++的全局函数
它的参数是一个(void * obj)指针 + 回调函数真正需要的参数
(void *)指针是待访问的对象
需要将指针使用 static_cast<CallableObj*> 进行强制转换,将传入的指针转换为回调类的对象指针。
C端的回调函数结构体
结构体中至少有两个元素:
- 一个空指针,用于存放回调函数类的对象地址;
- 一个函数指针,用于存放C++的全局函数
C端的回调函数注册函数
这个函数需要的参数至少比C++的全局函数的参数多一个。
该函数的主要任务是把C++全局函数的参数传递给另一个参数。
实现过程
- 将真正待注册的函数(类的非静态函数)bind为函数对象;
- 使用函数对象,初始化回调函数对象;
- 注册回调函数;