持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
今天继续讲解回调函数,不过这次是回调函数的晋升版:回调类。
1:什么情况下使用回调类呢?
2:回调类如何使用?
3:回调类类似于哪种模式?
带着这三个问题,讲述回调类使用以及注意事项问题。
1:什么情况下使用回调类?
有些情况下,当多个页面需要多个回调函数同时处理数据,你该如何操作?
方式1:使用上一篇文章中单个回调函数注册的方式,可以吗?答案是可以的!
方式2:使用重载回调函数的方式,可以吗?答案也是可以的!
无论是第一种和第二种,都避免不了注册很多函数,为了解决这一问题也为了以后接口更好兼容,总不能以后这个类中多一个回调函数,就需要多写一个注册回调函数方法吧,这样多累啦!
不过这种方式也不常用,只有做复杂页面展示以及联动情况会用到这种。
今天我们来讲解下如何使用C++实现简单的回调类
2:回调类简单使用
在C++中,对于类一定要用好了!回调类,顾名思义就是将所有的回调函数封装成类,对外只开放回调类指针,以后,无论添加多少回调函数都不用修改注册信息,修改简单。
2.1:定义回调类
假设,这个页面需要对外开放10个回调类。需要将所有的回调函数集成到类中。下面代码中只是拿出几个容易出错的进行展示。
class CCallBackProcessing
{
public:
virtual void CallBackFunc1() = 0;
virtual void CallBackFunc2() = 0;
virtual void CallBackFun3(int n) = 0;
}
看到这三个函数,是不是觉得很眼熟?没错!这是上一篇讲解回调函数重载用到的三个函数。
重载函数时,需要传入的参数不同,但是使用回调类时,就避免了重载遇到的问题。
2.2:注册回调类
注册方式与注册回调函数类似的,只是将参数由函数变成了指针。
CCallBackProcessing *m_pCallBackPtr; //回调类
//注册回调类
void SetCallBack(CCallBackProcessing* ptr)
{
m_pCallBackPtr = ptr;
}
2.3:使用回调类
回调类的使用方式与回调函数不同,因为回调类中全是虚函数,在实际调用类中需要继承回调类,并实现里面的回调方法,方法如下:
class COprationWidget:public QWidget,CCallBackProcessing
{
public: //实现定义的回调函数
virtual void CallBackFunc1();
virtual void CallBackFunc2();
virtual void CallBackFun3(int n);
}
实现了回调函数的方法,并且,不要忘记注册回调类
构造函数中,注册回调类 m_ptr->SetCallBack(this);
这里,有些人会疑惑,m_ptr是什么?
m_ptr是注册回调类的类,也就是说,哪个类中有SetCallBack注册函数,这里就指的是哪个类。
对于回调函数来说,m_ptr就是调用回调函数并传值的类。
上述工作准备完成后,回调类的简单使用也就完成了!
这样,无论是有多少个类需要调用回调函数,只需要继承回调类就可以获取数据了!是不是比回调函数方便呢?
3:回调类的相似模式
像这种一发多收的模式,像不像观察者模式?
观察者模式对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
也可以说回调类就是变相的观察者模式。如果有想要了解观察者模式是如何使用的,可以看这篇:C++登录后通知各个显示页面,采用观察者模式
今天的更新就到这里喽~
我是中国好公民st,一名C++开发程序猿~