需求:类比数组类,只不过数组类型不再是整型、浮点型等,也可以是类。

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++模板的应用的更多相关文章

  1. Jade模板引擎让你飞

    写在前面:现在jade改名成pug了 一.安装 npm install jade 二.基本使用 1.简单使用 p hello jade! 渲染后: <p>hello jade!</p ...

  2. ABP入门系列(2)——通过模板创建MAP版本项目

    一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...

  3. CMS模板应用调研问卷

    截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  6. OpenCV模板匹配算法详解

    1 理论介绍 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标.OpenCV ...

  7. 前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定

    一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.AngularJS是框架而jQuery则是库. 1.2. ...

  8. ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

  9. ThinkPHP 模板substr的截取字符串函数

    ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $start ...

  10. DDD领域驱动设计 - 设计文档模板

    设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...

随机推荐

  1. Django-ConttentType

    一 content-type 在django中,有一个记录了项目中所有model元数据的表,就是ContentType,表中一条记录对应着一个存在的model,所以可以通过一个ContentType表 ...

  2. zabbix自定义监控

    有的时候zabbix提供的监控项目,不能满足我们生产环境下的监控需求,此时我们就要按照zabbix的规范自定义监控项目,达到监控的目的 zabbix_get:模拟zabbix_server和agent ...

  3. Powerdesigner数据库建模的浅谈

    1.建立新模型 2.创建物理数据模型(可以选择数据库类型及版本) 3.建立表 左键点击Table这个图标,鼠标移动到空白工作区,再左键,一个表的视图就出来了,(连续左键,会出现多个表的视图),右键退出 ...

  4. 树上差分——点差分裸题 P3128 [USACO15DEC]最大流Max Flow

    讲解: https://rpdreamer.blog.luogu.org/ci-fen-and-shu-shang-ci-fen #include <bits/stdc++.h> #def ...

  5. DX与OpenGL投影矩阵的区别

    之前学习DX和OpenGL时到是知道一点,但是没仔细研究过,只是跟着教程抄个公式就过了,看双API引擎时发现转换时是个问题,必须搞懂,gamedev上找了个解释,希望用得上. https://www. ...

  6. 改善Python 程序的 91 个建议

    建议1.理解Pythonic概念—-详见Python中的<Python之禅> 建议2.编写Pythonic代码 (1)避免不规范代码,比如只用大小写区分变量.使用容易混淆的变量名.害怕过长 ...

  7. WHU1124 Football Match

    http://acm.whu.edu.cn/learn/problem/detail?problem_id=1124 题目大意:有N支球队,你们是第N支.每个队伍已经有一些分数了,接下来还有M场比赛. ...

  8. HTML+JS实现网站公告信息滚动显示

    一.可以直接使用marquee标签来实现 注意: 这个标签首先在早期的IE版本中加进来,后来逐渐被其他浏览器支持,W3C的不建议使用它. <marquee>在HTML和HTML5中都属于废 ...

  9. jQuery应用实例4:下拉列表

    应用场景:左侧是已有商品,右侧是未有商品,选择其中的内容点击箭头即可互换: 点击大箭头则全部内容去另一边,或者双击已有商品的选项也会加入右边: 代码实现: <!DOCTYPE html> ...

  10. Shell-8--数值运算及处理

    RANDOM 默认范围是 0~32767