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

来源:互联网 发布:java研发工程师南昌 编辑:程序博客网 时间:2024/06/10 02:02
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中方式更为简便。
阅读全文
0 0
原创粉丝点击