适应场景:classB 的实例作为classA类中的一个变量,classB 在运行中反而需要调用classA中的变量或者函数。
例如:相机的回调函数,classA为UI界面,classB 为相机SDK,classB 的实例作为classA类中的一个变量。classB 不断运行获取图片,并调用classA中的回调函数将图片显示在UI界面上。
思路:
classA include classB;
classA 通过classB中的函数registHeightCallbackB,FunA的指针和this指针传给classB;
classB调用FunA,并传入参数classA 的this指针;
classA 通过this指针调用classA 的函数;
#include "classB.h"
class classA
{
public:
classA();
~classA();
classB classB_;
//回调函数,在C++中必须是static 静态函数,因为C++类成员函数自带一个this的函数参数,而使用静态函数则不再有这个问题
static int funA(int a, void* contex);
int publicFun(int aa);//classB 需要使用到的实际函数
};
C++类静态成员函数不需要调用非静态成员函数和非静态成员变量,所以这里需要传入this指针,用于调用classA自身的非静态成员函数和非静态成员变量
#include "classA.h"
classA::classA()
{
classB_.registHeightCallbackB(funA, this);//注册回调函数 传入funA函数指针和this指针
}
classA::~classA()
{
}
int classA::funA(int a, void* contex)
{
classA* classa = (classA*)contex;
return classa->publicFun(a);
}
int classA::publicFun(int aa)
{
return aa + 1;
}
typedef int(*callback)(int, void* contex);//定义回调函数原型
class classB
{
public:
classB();
~classB();
callback callback_; //记录函数指针,用于调用
void* contex_; //记录classA的指针,用于传回给classA
void funB();
int registHeightCallbackB(callback callback, void* contex);//定义注册回调函数
};
#include "classB.h"
classB::classB()
{
}
classB::~classB()
{
}
void classB::funB()
{
int a = callback_(6, contex_);//例子:在classB中调用classA中的funA函数,返回6+1=7
}
int classB::registHeightCallbackB(callback callback, void* contex)
{
callback_ = callback;
contex_ = contex;
return 0;
}
参考文章:
C++回调函数使用心得:https://www.cnblogs.com/smartlife/articles/12519130.html
C++回调函数的基本理解和使用:https://blog.csdn.net/yidu_fanchen/article/details/80513359
回调函数(__stdcall):https://blog.csdn.net/songshu5555/article/details/46895231
类的静态成员变量和静态成员函数:https://www.cnblogs.com/songhe364826110/p/11546148.html