背景介绍:

在上一篇中 Sugar 说了类的用法,主要是介绍面向对象程序设计思想在 MCU 上的简单应用。

本篇介绍一个 C++ 的代码重用技能:模板类写法和用法。

为什么要“代码重用”

仍以加法计算器为例,在使用 C 语言的时候是这么写的:

int16_t add(int a, int b);
int16_t add(int a, int b){ return a+b;}

现在需要对 float 类型变量做加法,那么就变成了:

int16_t add(int   a, int   b);float   add(float a, float b);
int16_t add(int a, int b){ return a+b;}
float add(float a, float b){ return a+b;}

当我们需要对 int8_t、int32_t 和 double 类型变量做加法的时候c++模板类,我相信读者能想象出代码的样子。现在问:这样写代码的体验你喜欢么?如果回答是:非常喜欢且乐此不疲。那么可以不用往下看了,因为这样写没什么不可以的。

C++ 的“模板类”专门用于处理“一堆规则相同、只有类型不同”的函数。使用模板类不用再对重复的规则写代码,减小了代码的篇幅、提高了代码的可读性,大大缩减了代码的开发量和维护量。程序设计者在设计算法规则时精力只集中在一段代码上,就算出错也容易找。

模板类怎么写

模板类的写法非常简单,相比于介绍的普通类只是多了 template 和 typename 两个关键字。下面我们先把上一篇的 AP_Calc 类改成模板类看一看,如下:

中国移动 一卡通 a类 b类 c类客户_c++模板类_童装a类b类c类

从本篇起就不再像上一篇一样大篇幅写代码了,改用对比图的方式突出代码的修改部分。从上图中我们发现:

1、模板类就是在类名上面加了一行 template ;

2、把“原来指明的数据类型”改用“泛指类型” T 来代替。

这里提到了“泛指类型”,意思是不明确指定的类型。C++ 模板类允许在类定义的时候使用被 typename 关键字声明过的“泛指类型”来代替具体类型。

下面看下模板类的源文件该怎么改:

c++模板类_童装a类b类c类_中国移动 一卡通 a类 b类 c类客户

上图中是 AP_Calc.cpp 源文件中的修改,改了哪些一目了然,Sugar 拣几点总结一下:

1、每一个成员函数头顶上戴一个帽子 template ;

2、作用域运算符::前加上,并用 T 替换掉原来具体指明的类型;

3、最重要的是右边下方的三行 template 声明。

模板类怎么用

惯例先上一张图表明用法:

童装a类b类c类_c++模板类_中国移动 一卡通 a类 b类 c类客户

这里为了方便,Sugar 使用了 typedef 给模板类一个新名字,后面用新名字生成对象。一共两处修改,不用多说读者应该看一眼就懂。

模板类有什么优势

下面,我们做一个对 float 类型变量的加法计算器,看看模板类的优势。类的头文件不用改,只在源文件加 3 行就搞定了新加类型的模板,如下:

c++模板类_中国移动 一卡通 a类 b类 c类客户_童装a类b类c类

除了注释,就加了 3 行c++模板类,容易不?下面我们看下应用层怎么改的:

童装a类b类c类_c++模板类_中国移动 一卡通 a类 b类 c类客户

依旧是 3 行,int16_t 摇身一变成了 float,神奇不?

挖个坑下回来填

现在还不到讲解线性 Kalman 算法代码的时候,对于模板类还有一个点没有说到。我们现在已经能用模板类通吃各种类型了,但是对于“加法计算器”来讲,目前功能还是有点局限的:只能计算两个数相加。

我们能不能通过修改模板类,使其能对指定的 N 个数求和呢?答案是:肯定能的呀。但该怎么改呢?留到下篇说吧。

PS

模吧重磅福利:makeflyeasy航测 奋斗者手抛固定翼载机测评活动。复制下面链接在浏览器打开。

关注作者

限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688