成员静态函数和回调函数的灵活应用

回调函数与类静态函数

定义函数回调函数有两种方法

使用typedey定义函数指针

cpp 复制代码
#typedef int (*func)(void*);

如果有两个库之间不想产生依赖关系,但又需要访问相应的函数和得到返回值,例如:

  1. 前端点击了abort按钮,希望后台的复杂计算停止下来,但当后台的函数启动后,是无法实时,获得前端的操作的。
  2. 这样就引入了我们今天的话题,给算法传入一个前端的函数,然后在后台执行这个回调函数。
cpp 复制代码
class algorithm {

public:
	viod run(func callBack)
	{
		//do something
		void* para[2]; //传给前端的传输
		int aa;
		para[0] = &aa;
		if(callBack() == -1)
		{
		}
	};
}

class deskOperator{
public:
	bool isAbort(){m_isAbort = true;};
	//这个回调函数得是静态的
	static int myFunCalled(void* para)
	{
		//para 可以是一个存放指针得数组,每个元素可以存放任意类型的变量的地址;解引用就能得到丰富的参数
		void** pParas = (void**)para;
		int IntPara = *(int*)pParas[0];
		if(IntPara == 5)
		{
			if(!m_isAbort)
			{
				return 0;
			}
			
		}
		else
		{
			return -1;
		}
	}
	viod clickAbort(void)
	{
		algorithm* algor = new algorithm();
		func myFuuc = deskOperator::myFunCalled;
		algor.run(myFuuc);//这是一个很耗时的函数,同时也需要监听前端的停止动作
	}
	
	static bool m_isAbort; //这样的情况下左右的对象都是相同值
	//所以还可以考虑不用静态成员,这样实现动态获得m_isAbort;解决办法就是在传给算法回调函数时,将前端的地址也一并传过去,然后算法再将这个地址传回来,我们强制转换为deskOperator的对象,然后调用deskOperator(实例).m_isAbort,这样就可以了。
}

使用 std::function<void(void*)> 包装

后面补齐

相关推荐
小指纹1 小时前
河南萌新联赛2025第(六)场:郑州大学
java·开发语言·数据结构·c++·算法
岁忧2 小时前
(nice!!!)(LeetCode 每日一题) 1277. 统计全为 1 的正方形子矩阵 (动态规划)
java·c++·算法·leetcode·矩阵·go·动态规划
咔咔咔的2 小时前
679. 24 点游戏
c++
the sun342 小时前
Reactor设计模式及其在epoll中的应用
linux·运维·服务器·c++
Davis_12193 小时前
代码随想录算法训练营27天 | 56. 合并区间、738.单调递增的数字、968.监控二叉树(提高)
数据结构·c++·算法·leetcode·贪心算法
闻缺陷则喜何志丹3 小时前
【倍增 桶排序】后缀数组
c++·算法·倍增·桶排序·后缀数组·lcp·后缀树
zylyehuo3 小时前
C++核心编程
c++
励志不掉头发的内向程序员4 小时前
STL库——string(类模拟实现)
开发语言·c++
郝学胜-神的一滴4 小时前
使用C++11改进工厂方法模式:支持运行时配置的增强实现
开发语言·c++·程序人生·设计模式
Korloa5 小时前
表达式(CSP-J 2021-Expr)题目详解
c语言·开发语言·数据结构·c++·算法·蓝桥杯·个人开发