C++|回调函数重载注意事项

310 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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++开发程序猿~