什么是回调函数?
就是以函数指针做参数传递给另一个函数称之为回调函数, 字面意思很简单, 但就这几个字想理解回调函数, 那又很难。因此别就这这字面意思, 只要知道怎么用, 在什么情况下用就行了
什么场景下需要使用回调函数
回调函数主要是完成通知功能, 例如我领导给我分配另外工作, 但是我手里工作又没做完, 那领导总不可能没过个几个小时就跑过来问一下,这样我们两个人都很烦, 而在代码中如果这样实现(需要开一个线程, 不停的轮寻)也很消耗系统资源, 所以最好的办法就是等我手里的工作完成了, 我自己去和领导说,然后进入下个工作任务, 而在我们代码中想要这样实现就需要通过回调函数来完成
回调函数3要素:
- 定义一个函数指针(和回调函数的参数类型,数量,顺序,返回值全部一致)。
- 定义一个类成员静态回调函数(备注:类成员回调函数必须是static)。
- 回调函数和函数指针绑定在一起。
回调函数用法1: C98回调函数写法
//该类相当于上面例子中员工(我)的角色
using namespace std;//定义一个函数指针
typedef void(*PrintName)(string strName);
enum CallType
{
NAME,
AGE,
GRADE,
};
class CallBack
{
public:
CallBack();
~CallBack();
public:
void TestCallBack(CallType type);
public:
PrintName m_PrintName;
};
#include <memory>
#include "CallBack.h"
class BaseCall
{
public:
BaseCall();
~BaseCall();
public:
//静态的类成员函数
static void onPrintName(string strName);
private:
std::shared_ptr<CallBack> m_CallBack;
};
BaseCall::BaseCall()
{
m_CallBack = make_shared<CallBack>();
//和回调函数绑定
m_CallBack->m_PrintName = onPrintName;
m_CallBack->TestCallBack(NAME);
}
BaseCall::~BaseCall()
{
}
void BaseCall::onPrintName(string strName)
{
printf("姓名: %s\n", strName.c_str());
}
Qt 中的回调函数
而在Qt中传数据,我们是使用信号槽系统,但这并不意味着不能使用旧的经过验证的方法,即使用 CallBack回调函数功能。
事实上使用 CallBack 功能比信号和槽要快一些。并且当发送信号的对象在程序中被销毁并且不再使用时,就信号理想地从槽中分离而言,回调可以更容易使用。
假设A类包含B类的对象,B类有动作时想要通知到A类,B类应该有个设置回调函数的接口,A类应该定义相应的回调函数,将函数指针传递给B。