C++模板的应用
需求:类比数组类,只不过数组类型不再是整型、浮点型等,也可以是类。
1、创建模板类
头文件
#ifndef MYVECTOR_H #define MYVECTOR_H #include <iostream> #include"Teacher.h" using namespace std; template <typename T> class myVector { public: myVector(); void init(int size=0); //构造函数 myVector(const myVector &obj); //拷贝构造函数 ~myVector(); //析构函数 const int getLen() const; const T* getSpace() const {return m_space;} T& operator [](int index); myVector<T> &operator =(const myVector<T> &obj); private: T *m_space; int m_len; }; #endif // MYVECTOR_H
资源文件
#include "myvector.h" #include"Teacher.h" template<typename T> myVector<T>::myVector() { m_space = NULL; m_len = 0; } template<typename T> void myVector<T>::init(int size){ m_space=new T[size]; this->m_len=size; } template<typename T> myVector<T>::myVector(const myVector &obj) //拷贝构造函数 { m_len=obj.m_len; cout<<m_len<<endl; m_space=new T[m_len]; for (int i = 0; i < m_len; ++i) { m_space[i]=obj.m_space[i]; } } template<typename T> myVector<T>::~myVector() //析构函数 { cout<<"destory....."<<endl; if(m_space != NULL){ delete [] m_space; m_space=NULL; m_len=0; } } template<typename T> const int myVector<T>::getLen() const{ return m_len; } template<typename T> T& myVector<T>::operator [](int index) { return m_space[index]; } template<typename T> myVector<T> & myVector<T>::operator= (const myVector<T> &obj) { //先释放旧的内存 if(m_space != NULL){ cout<<"not null"<<endl; delete[] m_space; m_space=NULL; m_len=0; } //根据参数分配内存 int length = obj.getLen(); m_space=new T[length]; this->m_len=length; for (int i = 0; i < m_len; ++i) { m_space[i]=obj.getSpace()[i]; } return *this; }
2、实验类
头文件
#ifndef TEACHER_H #define TEACHER_H #include<iostream> using namespace std; class Teacher { public: Teacher(); Teacher(char *name,int age); Teacher(const Teacher &teacher); ~Teacher(); void printTeacher(); friend ostream &operator <<(ostream &out,Teacher &teacher); Teacher &operator =(const Teacher &teacher); private: int age; char *name; }; #endif // TEACHER_H
资源文件
#include "Teacher.h" #include<iostream> #include<string.h> using namespace std; Teacher::Teacher(){ age=0; name=new char[1]; strcpy(name," "); } Teacher::Teacher(char *name, int age){ this->name=new char[strlen(name)]; strcpy(this->name,name); this->age=age; } Teacher::Teacher(const Teacher &teacher){ this->name=new char[strlen(teacher.name)]; strcpy(this->name,teacher.name); this->age=age; } Teacher::~Teacher(){ if(this->name!=NULL){ delete[] this->name; this->name=NULL; age==0; } } void Teacher::printTeacher(){ cout<<"Teacher( name: "<<this->name<<" age: "<<this->age<<" )"<<endl; } ostream &operator <<(ostream &out,Teacher &teacher){ out<<"Teacher( name: "<<teacher.name<<" age: "<<teacher.age<<" )"<<endl; return out; } Teacher & Teacher::operator =(const Teacher &teacher){ if (this->name != NULL) { delete[] this->name; this->name=NULL; } this->name=new char[strlen(teacher.name)]; strcpy(this->name,teacher.name); this->age=teacher.age; return *this; }
3、测试函数
主函数
#include "myvector.cpp" #include"Teacher.h" int main(){ myVector<int> myv; myv.init(10); for (int i = 0; i < myv.getLen(); ++i) { myv[i] = i+1; cout<<myv[i]<<" "; } cout<<endl; myVector<int> myv2=myv; for (int i = 0; i < myv2.getLen(); ++i) { cout<<myv2[i]<<" "; } cout<<endl; myVector<int> myv3; myv3=myv; for (int i = 0; i < myv3.getLen(); ++i) { cout<<myv3[i]<<" "; } Teacher t1("ggg",22),t2("qqq",23),t3("xxx",24); myVector<Teacher> t; t.init(3); t[0]=t1; t[1]=t2; t[2]=t3; cout<<endl; for (int i = 0; i < 3; ++i) { cout<<t[i]; } return 0; }
注意事项:
在主函数中加入了
#include "myvector.cpp"
问题的根源在于编译器对于模板(template)的编译处理过程中,
大致是这样的(果真如此么?):
1、模板myVector在编译(compile)期间并未生成具体二进制代码,
在main函数中也没有嵌入这个函数的代码,可能只是包含了一句
call testFunc之类的(稍后详述)
2、编译阶段,在main函数中发现了myVector的引用,但是main.obj中没有相关的
可执行代码(编译器认为该函数在别处定义,这就是为什么需要链接也就是
LINK了,在main中虽然引用到myVector但是只提供了一个call虚拟地址而没有
实际的执行代码)
3、链接阶段,将各个模块(编译期间生成的很多*.obj文件)组织起来
形象的说就是,在LINK的时候把testFunc“嵌入”进来,就像是一个子过程,
在main中从调用处jump到这里即可,执行完毕再跳出子模块,从“中断点”
继续执行后续语句)
4、模板在编译期间是不生成具体代码的。
C++模板的应用的更多相关文章
- Jade模板引擎让你飞
写在前面:现在jade改名成pug了 一.安装 npm install jade 二.基本使用 1.简单使用 p hello jade! 渲染后: <p>hello jade!</p ...
- ABP入门系列(2)——通过模板创建MAP版本项目
一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...
- CMS模板应用调研问卷
截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
- OpenCV模板匹配算法详解
1 理论介绍 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标.OpenCV ...
- 前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定
一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.AngularJS是框架而jQuery则是库. 1.2. ...
- ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案
好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...
- ThinkPHP 模板substr的截取字符串函数
ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $start ...
- DDD领域驱动设计 - 设计文档模板
设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...
随机推荐
- APIView流程——请求方式分发
- Linux系统中的tar命令
时间一长什么东西都容易忘记,尤其是一些不常用的东西忘记的更快,所以避免忘记,就记录下来,可以方面使用的时候查询.Tar命令在linux系统中算是一个比较重要的命令,今天就针对该命令进行总结一下. 1. ...
- MySQL开发——【多表关系、引擎、外键、三范式】
多表关系 一对一关系 一对多或多对一关系 多对多关系 MySQL引擎 所谓的MySQL引擎就是数据的存储方式,常用的数据库引擎有以下几种: Myisam与InnoDB引擎之间的区别(面试) ①批量插入 ...
- 搭建Fabric网络(三)artifacts是怎么生成的:cryptogen和configtxgen
在first-network里,./byfn.sh generate可以生成artifacts文件. generate参数其实是使用了cryptogen和configtxgen这两个工具,这两个工具分 ...
- 模板学习实践一 accumulationtraits
// 11111.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...
- caoni大业 spring boot 跳坑记
IDEA环境 win10 跑得刚刚,到xp系统就戈壁 报错 Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.g ...
- SAS语言结构
SAS程序用于访问.管理.分析和展现数据.其基础组成部分是 DATA步和PROC步,PROC步又称为SAS过程.一个SAS程序可包含以 任意顺序组合的多个DATA步和多个PROC步. DATA步通常用 ...
- JavaScript日历(es5版本)
近期在知乎上看到这么一个帖子,题主说自己JavaScript都学完了,结果老师留的作业还是不会写,就是写一个日历的插件,结果楼下一堆大牛出现了,百度的阿里的纷纷站出来发表自己的看法,有人认为简单,有人 ...
- IDEA中MyBaits的Mapper文件颜色问题
IDEA中MyBaits的Mapper文件颜色问题 在IDEA中Mapper文件的展示 包含的警告及其解决方案 然后我们就完成了,效果如下 在IDEA中Mapper文件的展示 在IDEA中,Mappe ...
- 使用pyinstaller打包python小程序(没有使用第三方模块)
准备: 1,xxx.py程序文件 2,自定义的图标文件:xxx.ico 图标文件应该包含常见的多分辨率格式,以便适应在不同场合显示,不能是单一图片. 你可以用专用的软件处理生成图标,不过少量的图标生产 ...