C++ 回调函数 例子

适应场景: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

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值