您的位置:首页 > 编程语言 > C语言/C++

C++中类模板和实现分离的方法

2017-08-29 18:46 567 查看
C++中模板类的声明和实现分离问题

2017-08-29

有两种方式:

第1种:使用 .tpp 文件实现类模板的接口与实现的文件分离

在.h文件中放接口,在.tpp文件中放实现,但这种方法得在.h文件中,类的定义下面#include ".tpp"文件,如下:

//TestTemplate.h文件

#pragma once

template <typename T>

class TestTemplate{

public:

TestTemplate(const T& a): data(a){}

void print();//需要实现的方法

private:

T data;

};

#include "TestTemplate.tpp" //在类的定义下面放置#include ".tpp"文件

(其实,在这种情况下,实现文件TestTemplate.tpp文件,不一定要取这个名字,可以随便取个名字,如: abc.t、 xysearf.cod等都行,该行的作用实际上就是直接将代码包含进去,没什么太大的意义)

//TestTemplate.tpp文件

template <typename T>

void TestTemplate<T>::print(){

std::cout << "TestTemplate data: "<< data << std::endl;

}

//main.cpp文件

#include<iostream>

#include "TestTemplate.h"

int main(int argc, char **argv){

TestTemplate<int> a(static_cast<int>(3));

a.print();//输出 TestTemplate data: 3

TestTemplate<float> b(static_cast<float>(-3.1));

b.print();//输入 TestTemplate data: -3.1

cin.get();

return 0;

}

//输出结果

TestTemplate data: 3

TestTemplate data: -3.1

第2种:使用显式声明实现类模板的接口与实现的文件分离

在.h文件中放接口,在.cpp文件中放实现,然后在.cpp文件中显式的声明要使用的模板类实例,如下:

//TestTemplate.h文件

#pragma once

template <typename T>

class TestTemplate{

public:

TestTemplate(const T& a): data(a){}

void print();

private:

T data;

};

//TestTemplate.cpp文件

#include "TestTemplate.h"

#include<iostream>

template <typename T>

void TestTemplate<T>::print(){

std::cout << "TestTemplate data: "<<std::data<<endl;

}

template class TestTemplate<int>;//显式声明要使用的模板类实例

template class TestTemplate<float>;//显式声明要使用的模板类实例

(如果main.cpp文件中需要用到 TestTemplat<char>,那么只需要在TestTemplate.cpp文件中添加一行代码:template class TestTemplate<char>;)

//main.cpp文件

#include <iostream>

#include "TestTemplat.h"

using namespace std;

int main(int argc, char **argv){

TestTemplate<int>a(3);

a.print();//输出 TestTemplate data: 3

TestTemplate<float>b(static_cast<double>(-3.1));

b.print();//输入 TestTemplate data: -3.1

cin.get();

return 0;

}

//输出结果

TestTemplate data: 3

TestTemplate data: -3.1

总结

上面的两种方式,都可以实现类模板和实现相分类,但是相比之下,第1中方式更为简便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: