电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
适合具备 C 语言基础的 C++ 入门教程(十)
分 享
扫描二维码分享
适合具备 C 语言基础的 C++ 入门教程(十)
C++
wenzi 嵌入式软件
关注
发布时间: 2021-03-19
丨
阅读: 385
# 前言 在上一则教程中,叙述了抽象类以及动态链接库的相关内容,本节来叙述一下抽象类界面的相关内容,以及本节即将引入一个新的概念,模板。 ## 抽象类界面 何为抽象类界面呢?要说清楚这个概念,需要回顾上一则教程中所述的**类编程**和**应用编程**两个概念,为了实现应用编程和类编程,引入了动态链接库的概念,要达到的效果就是当更改类的代码的时候,而不更改应用程序的代码的时候,只需要重新生成动态链接库,而不需要重新生成可执行文件。那么我们回顾之前的代码,看应用编程里面的内容,也就是主函数里面的内容: ```cpp #include "Human.h" #include "Englishman.h" #include "Chinese.h" void test_eating(Human *h) { h->eating(); } int main(int argc, char **argv) { Englishman e; Chinese c; Human* h[2] = {&e, &c}; int i; for (i = 0; i < 2; i++) test_eating(h[i]); return 0; } ``` 在上述代码中,我们看到第一行代码和第二行代码包含了头文件`Englishman.h`和 `Chinese.h`,那么这个时候,如果更改了类中代码,比如说我们更改了`Englishman.h`或者是`Chinese.h`的代码,这个时候在编译的时候,如果只编译动态链接库,而不编译应用程序,那么必然会导致程序出现问题。那要如何解决这个问题呢,所采取的一种思路便是使用抽象类界面的思路来进行解决。 下面是抽象类界面的一个示意图: ![image-20210224101410895](https://gitee.com/wenzi_D/images4mk/raw/master/image-20210224101410895.png) 通过这张示意图也可以明白,这个时候,APP也就是应用程序的代码只和`Human.h`相关,而 `Human.h`又和`Englishman`和`Chinese`有关,这样一来,如果改变的是`Englishman`或者是`Chinese`类的代码,那么就不会影响到应用程序,仍然只需要重新编译动态链接库就好。 说了那么多,该如何做呢,我们先从主函数看起,下面是更改之后的主函数: ```cpp #include "Human.h" void test_eating(Human *h) { h->eating(); } int main(int argc, char **argv) { Human& e = CreateEnglishman("Bill", 10, "sfwqerfsdfas"); Human& c = CreateChinese("zhangsan", 11, "beijing"); Human* h[2] = {&e, &c}; int i; for (i = 0; i < 2; i++) test_eating(h[i]); return 0; } ``` 看到上述代码,第一,头文件中,`Englishman.h`和`Chinese.h`不见了,只剩下一个`Human.h`,正如上面所说,`APP`的代码只和`Human.h`有关联;第二,之前有`Englishman`和`Chinese`的实例化对象,现在改为了使用函数调用生成`Human`类的引用,来替代之前的实例化对象。 那自然,这两个函数调用是在`Human.h`中声明的了,`Human.h`的代码如下所示: ```cpp #ifndef _HUMAN_H #define _HUMAN_H #include
#include
#include
using namespace std; class Human { private: char *name; public: void setName(char *name); char *getName(void); virtual void eating(void) = 0; virtual void wearing(void) = 0; virtual void driving(void) = 0; }; Human& CreateEnglishman(char *name, int age, char *address); Human& CreateChinese(char *name, int age, char *address); #endif ``` 为了使得应用编程和类编程相互分离,那么这两个函数的定义自然分别为了`Englishman`和`Chinese`了,代码分别如下所示: ```cpp /@@* 当前处于Englishman.cpp中 */ Human& CreateEnglishman(char *name, int age, char *address) { return *(new Englishman(name, age, address)); } ``` 下面是`CreateChinese`的函数定义,代码如下所示: ```cpp Human& CreateChinese(char *name, int age, char *address) { return *(new Chinese(name, age, address)); } ``` 这样一来,就实现了抽象类界面,在更改`Englishman`和`Chinese`的代码的时候,不需要重新生成可执行文件,只需要重新生成动态链接库就可以了。 ## 模板 在`C++`中的模板定义中,模板有两类,一个是函数模板,一个是类模板,在本节的教程中,主要是讲述函数模板的相关内容。 ### 函数模板的引入 为什么要引入函数模板呢,我们来看一下如下所示的代码: ```cpp int& max(int& a, int& b) { return (a < b)? b : a; } double& max(double& a, double& b) { return (a < b)? b : a; } float& max(float& a, float& b) { return (a < b)? b : a; } ``` 上述的代码是`max`函数的一个重载,观察这个重载函数,可见,每个重载函数的两个形参是相同的,并且形参和返回值一样,基于此,我们也就可以定义一个函数模板来替代这些函数重载,函数模板定义如下: ```cpp template
T& max(T&a,t&B) { return (a < b)? b : a; } ``` 如何理解上述模板函数呢,实际上也就是说,**把类型用`T`来替换了**。 基于模板函数,我们再来实现上述使用重载而实现的功能,代码如下所示: ```cpp #include
#include
#include
using namespace std; template
T& mymax(T& a, T& b) { cout<<__PRETTY_FUNCTION__<
#include
#include
using namespace std; template
const T& mymax(const T& a, const T& b) { cout<<__PRETTY_FUNCTION__<
#include
#include
using namespace std; template
T& mymax(T& a, T& b) { cout<<__PRETTY_FUNCTION__<
#include
#include
using namespace std; template
const T& mymax(const T& a, const T& b) { cout<<__PRETTY_FUNCTION__<
const T* mymax2(const T* a, const T* b) { cout<<__PRETTY_FUNCTION__<
注:`cout<<__PRETTY_FUNCTION__<
void test_func(T f) { cout<<__PRETTY_FUNCTION__<
链接:https://pan.baidu.com/s/13_g0L9KBTSVJWDvOrksrfQ > 提取码:gfsb
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
wenzi 嵌入式软件
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交