关键字 :函数、回调、解耦
什么是回调函数?
回调函数就是:允许用户把需要调用的函数的指针作为参数传递给另一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
解释:我们把一个函数作为参数传递一个执行函数,这个负责执行的函数的功能就是负责调用和执行传递给它的函数。此时这个函数被执行的函数就叫做回调函数。
注意:回调并不是“你我”两方的互动,而是ABC的三方联动。有了这个清楚的概念,在自己的代码里实现回调时才不容易混淆出错。
为什么要使用回调函数?
通过一个中间函数来为函数解耦。
即:当我们需要使用一个函数的时候,我们不在函数体中直接调用该函数,而是通过另外一个函数来间接调用它。
怎么使用回调函数?
基本使用:
例:
/*首先我们要了解回调函数的执行过程
即:当我们需要调用一个函数的时候,需要通过一个中间函数来登记这个函数,然后通过这个中间/函数调用或者间接调用。
此时,这个函数就是回调函数,这个过程就是一个回调的过程
*/
#include
using namespace std;
void onHeight(double height,void * centex)
{
cout<<“the height is :”<<height<<endl;
}
//需要创建一个相应的函数指针
typedef void (*CallbackFun)(double height,void * centex) ;
//我们给函数指针再加一个指针用来解耦
CallbackFun * m_pCallback;
void registHightCallback(CallbackFun callbackfun,void * centex)
{
// callbackfun(h,nullptr);
//我们不直接调用Callback,而是在其他函数里面调用
*m_pCallback=callbackfun;
}
//定义一个新函数用来输出height,我们通过上面第定义的函数指针(CallbackFun)的指针 m_pCallback 来调用函数
void printHightFun(double height)
{
(*m_pCallback)(height,nullptr);
}
int main(void)
{
registHightCallback(onHeight,nullptr);
return 0;
}
本例借鉴于: https://blog.youkuaiyun.com/sinat_38183777/article/details/83958887
在C++中对回调函数进行了拓展
我们可以使用全局或者静态的函数作为回调函数,但是全局函数会破坏封装性,所以一般使用静态成员函数——只能访问静态成员。但是,我们在回调函数中我们需要使用静态成员函数来调用非静态成员!
场景一:普通实现方法
class Test
{
float m_number;
public:
//定义一个静态函数,我们在内部调用一个getNumber函数
static void ThePrint(float Number)
{
Test * hui_class_pt;
hui_class_pt->getNumber(Number);
}
//实时函数
void getNumber(float input)
{
cout<<"this number is "<<input<<endl;
}
}
int main(void)
{
Test hui;
hui.ThePrint(10);
return 0;
}
场景二:增强版
class Test
{
float m_number;
public:
//定义一个静态函数,我们在内部调用一个getNumber函数
static void ThePrint(float Number, void *pt)
{
//我们把void *指向本类
Test * hui_class_pt=(Test *)pt;
if(hui_class_pt)
hui_class_pt->getNumber(Number);
}
//实时函数
void getNumber(float input)
{
cout<<"this number is "<<input<<endl;
}
}
int main(void)
{
Test hui;
Test * hu;
hui.ThePrint(10,hu);
return 0;
}
场景三:回调版
#include
using std::cout;
using std::endl;
class Huidiao_calss
{
float m_number=10;
public:
// Huidiao_calss(){}
// ~Huidiao_calss(){}
//定义一个静态函数,我们在内部调用一个getNumber函数
static void ThePrint(float Number,void * input_pt)
{
//我们把void *指向本类
Huidiao_calss * hui_class_pt=(Huidiao_calss *)input_pt;
hui_class_pt->getNumber(Number);
}
//实时函数
void getNumber(float input)
{
cout<<"this number is "<<input<<endl;
}
//函数指针,指向的是 getnumber 类型
typedef void (func_pt)(float,void);
//中间函数,通过调用这个中间函数我们回调传入的函数
void H_among_Fun(func_pt f_pt,float num,void * mes_pt)
{
f_pt(num,mes_pt);
}
//注册回调函数
void Back_thePrint()
{
//传入我们需要回调的静态函数,需要显示的数据,this指针
H_among_Fun(ThePrint,this->m_number,this);
}
};
int main(void)
{
Huidiao_calss hui;
hui.Back_thePrint();
return 0;
}