持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
今天来给大家讲解一个小功能:使用回调函数时,回调函数重载的使用方法。
回调函数的使用大家应该不陌生吧?
前些日子总结了一篇C++|指针函数与回调使用对比,这里面讲述了如何简单实现一个回调函数。
这次对简单的回调函数进行提升,当有多个回调函数时,如何应用的问题。
假设,类中需要回调3个回调函数,如下所示:
回调函数1:void CallBackFunc1();
回调函数2:void CallBackFunc2();
回调函数3:void CallBackFunc3(int n);
以上三个回调函数中有两个是不带参数的,按照简单的回调函数写法,需要定义三个注册函数,也就是三个注册回调函数。
例如:
void SetCallBackFunc1(CallBackFunc1 func);
void SetCallBackFunc3(CallBackFunc2 func);
void SetCallBackFunc3(CallBackFunc3 func);
这样做是没问题的,并且使用与一个回调函数的使用方式一致,程序不会出现任何问题。
那么,接下来是要对注册函数的优化工作了!
在程序中其实没必要注册多个回调函数方法,可以采用C++的重载函数方式,这样代码既简洁又清晰。调用者在注册回调函数时也不必分清哪个是CallBackFunc1的回调,哪个是CallBackFunc2的回调。
对于重载函数,大家都不会陌生吧!
函数名称相同,参数不同而已。
使用回调函数重载就需要注意这样一个问题:将上面三个回调函数,使用函数重载的方式修改后,会发现有问题!
错误:error C2535: “void CPR::SetCallBackFunc(CallBackFunc1)”: 已经定义或声明成员函数 (编译源文件 xxx.cpp)
这时候就需要仔细注意了,有两个需要回调的函数是不带参数的!虽然参数传入的是函数体,其实与传入int、float类型没什么区别,只是函数名称变了而已,返回值以及参数都相同。在编译过程中就会当成一个类型的参数处理。
根据重载函数的使用规则,CallBackFunc1、CallBackFunc2就不能使用同一个注册函数了,这时候就需要区分注册函数。这里需要注意!
这么一个简单的问题,今天就有人问我,为什么注册回调函数时总是出问题,感觉写的方法也没错呀!
往往最简单的方式也是最容易忽略的,很多情况下,传入函数作为参数时,最容易出现重载错误,这里需要大家在代码中引起注意了。
我是中国好公民st,一名C++开发程序猿~