函数指针与回调函数与信号槽

       给实验室编写hdntCenter的charts库的时候,遇到了一些问题,其中一点是串口读数丢失数据,可能跟QT的信号-槽机制的速度太慢有关,师兄建议避开信号-槽机制,改用回调函数的方式来写。

       关于回调函数,有一下几点问题

  1. 什么是回调函数
  2. 如何创建回调函数
  3. 如何使用回调函数
  4. 回调函数和信号-槽机制的比较与取舍
  5. 其他的注意事项

1. 什么是回调函数 

 https://blog.csdn.net/callmeback/article/details/4242260 中,对

  1. 回调函数是什么东西?
  2. 回调函数怎么开发,怎么使用?
  3. 回调函数的作用,应该在什么情况下使用?

这三个问题做了解答。

       抛开回调的机制不说,回调函数本身,可以理解为将函数作为一个自变量,赋予另一个函数,可以类比为复变函数。而赋值的方式,则为函数指针。即将一个指向被调用函数的地址的指针,作为实参传递给调用函数。

2.如何创建回调函数

回调函数本身与一般的函数并无区别,符合通用的创建函数的准则。

3.如何使用回调函数&函数指针

i 使用回调函数首先需要创建被回调函数本身。

int add1(int datIn)
{
	return datIn + 1;
}

int minus1(int datIn)
{
	return datIn - 1;
}

ii 函数指针的声明

int(*pFunc)(int);

要注意的是,函数指针和被指向的函数之间必须严格保持同样的格式,包括返回类型和参数类型及个数。

另外,要注意与指针函数区分开来

int *pFunc(int);

上面的代码声明了一个返回int指针的函数。

在声明了被调用函数之后,可以用函数名来初始化函数指针,编译器会自动将函数名转换为地址,并将其储存在该指针中。

int(*pFunc)(int) = minus1;

iii 创建调用函数

int getAns(int datIn, int (*pfunc)(int))
{
	return pfunc(datIn);
}

同样,调用函数中,涉及到函数指针的形参部分,格式必须严格一一对应,否则无法调用。

完整代码如下:

#include <stdio.h>
#include<iostream>
using namespace std;

int add1(int datIn)
{
	return datIn + 1;
}

int minus1(int datIn)
{
	return datIn - 1;
}

int getAns(int datIn, int (*pfunc)(int))
{
	return pfunc(datIn);
}

void main()
{
	int datIn = 2;
	int datOut1, datOut2;
	int(*pFunc)(int);//声明函数指针


	cout << "回调函数的结果:" << endl;
	datOut1 = getAns(datIn, add1);
	datOut2 = getAns(datIn, minus1);
	cout << "datOut1:" << datOut1 << endl;
	cout << "datOut2:" << datOut2 << endl;

	cout << "----------" << endl;
	cout << "直接使用函数指针的结果:" << endl;
	pFunc = add1;//给函数指针幅值
	cout << "datOut1:" << pFunc(2) << endl;
	pFunc = minus1;
	cout << "datOut2:" << pFunc(2) << endl;

	getchar();
}

运行结果如下:

此外,函数指针也可以进行迭代:

	cout << "----------" << endl;
	cout << "函数指针的迭代:" << endl;
	pFunc = add1;
	cout << "pFunc(pFunc(2)):" << pFunc(pFunc(2)) << endl;

其结果如下:

4.回调函数和信号-槽机制的比较与取舍

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值