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领域驱动设计 - 设计文档模板
设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...
随机推荐
- gitlab 10汉化
记得备份 先检查一下版本,好下载对应的汉化包 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION 1)然后下载10.0.x.diff 文件到服务 ...
- 别人的Linux私房菜(7)文件与目录管理
- 代表上一个工作目录 ~username代表用户所在的家目录 cd切换目录 配合之上的参数 . .. / ~ ~name (change directory) pwd显 ...
- 大数据 Spark 架构
一.Spark的产生背景起源 1.spark特点 1.1轻量级快速处理 Saprk允许传统的hadoop集群中的应用程序在内存中已100倍的速度运行即使在磁盘上也比传统的hadoop快10倍,Spar ...
- Forward团队-爬虫豆瓣top250项目-模块测试
项目托管平台地址:https://github.com/xyhcq/top250 模块测试:爬虫对信息的处理部分 测试方法: 实际运行一下代码: 可以看见,信息都已经爬取出来了 其他补充说明: 原本系 ...
- UEditor的jQuery插件化 -转
UEditor本身并不依赖jQuery,但如果在项目中同时使用两者的话,可能会希望使用jQuery语法创建和获取编辑器实例.为此,需要为jQuery编写插件,代码如下: (function ($) { ...
- django扩展User认证系统
第一种方法proxy 如果你对Django提供的字段,以及验证的方法都比较满意,没有什么需要改的.但是只是需要在他原有的基础之上增加一些操作的方法.那么建议使用这种方式.示例代码如下: #在model ...
- docker 容器和镜像理解
1.镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器.容器和镜像是一对一的,一个容器里就运行一个镜像. 1.base镜像----提供了一个基本的操作系统环境,用户可以根据需要安 ...
- git 命令(提高篇)的本质理解
上一篇博客:[[git 命令(提高篇)的本质理解] (http://www.cnblogs.com/juking/p/7105744.html)]介绍了Git 的基础知识 -- 提交.分支以及在提交树 ...
- C#实现录音录像录屏源码
以前写过两篇录音和录像的文章(实现语音视频录制.在服务器端录制语音视频),最近有朋友问,如果要实现屏幕录制这样的功能,该怎么做了?实际上录屏的原理跟录音.录像是差不多的,如果了解了我前面两篇文章中介绍 ...
- Android开发 - 掌握ConstraintLayout(三)编辑器
从本篇博客开始我们开始介绍如何使用ConstraintLayout. 既然ConstraintLayout叫约束布局,首先我们先介绍什么叫约束(Constraints): 约束(Constraints ...