本文是对类模板声明与实现的实践。
一. 常规的写法分成3个文件
seqList.h.h文件:
//顺序表的类声明
#define defaultSize 100
template<class T>
class SeqList {
private:
T* data; //存放数组
int maxSize; //可容纳最大表项的项数
int current; //当前表项的最后位置(从0开始)
public:
SeqList(int sz = defaultSize); //构造函数
~SeqList() { if (data != nullptr) delete[]data; }
int getSize(); //获取maxSize
};
seqList.h.cpp文件
#include"seqList.h"
#include<iostream>
using namespace std;
//定义构造函数
//通过指定参数sz定义数组长度
template<class T>
SeqList<T>::SeqList(int sz /*= defaultSize*/) {
if (sz > 0) {
maxSize = sz; current = -1; //设置表的实际长度为空
data = new T[maxSize]; //创建顺序表存储数组
if (data == nullptr) { //动态分配内存失败
cerr << "内存分配失败!" << endl;
exit(1);
}
}
}
template<class T>
int SeqList<T>::getSize() {
return maxSize;
}
main.cpp文件
#include"seqList.h"
#include<iostream>
using namespace std;
int main() {
SeqList< int >testList(5);
cout << testList.getSize() << endl;
return 0;
}
结果显示:
都是一些莫名奇妙的错误啊,开始我按照错误提示去问度娘,却一点收获都没有,不过最后还是解决了,大家请看!!:
二. 类模板和模板函数以及成员函数放在一个.h文件中
seqList.h文件:
#pragma once
#include<iostream>
using namespace std;
//顺序表的类声明
#define defaultSize 100
template<class T>
class SeqList {
private:
T* data; //存放数组
int maxSize; //可容纳最大表项的项数
int current; //当前表项的最后位置(从0开始)
public:
SeqList(int sz = defaultSize); //构造函数
~SeqList() { if (data != nullptr) delete[]data; }
int getSize(); //获取maxSize
};
//定义构造函数
//通过指定参数sz定义数组长度
template<class T>
SeqList<T>::SeqList(int sz /*= defaultSize*/) {
if (sz > 0) {
maxSize = sz; current = -1; //设置表的实际长度为空
data = new T[maxSize]; //创建顺序表存储数组
if (data == nullptr) { //动态分配内存失败
cerr << "内存分配失败!" << endl;
exit(1);
}
}
}
//获取maxSize
template<class T>
int SeqList<T>::getSize() {
return maxSize;
}
main.cpp文件:
#include"seqList.h"
int main() {
SeqList< int >testList(5);
cout << testList.getSize() << endl;
return 0;
}
结果显示:
代码一点没有变。仅仅是调换了位置。。。。。。。。。就可以了,所以:一般情况下我们编写C++代码的时候都会习惯性的将声明性的代码放在.h文件中,然后将实现文件放在.cpp文件中,只需加载相关的.h文件即可。但是在类模板中这个是行不通的,如果遇到这种情况,只需要将类模板的实现在其对应的声明文件中就可以解决问题。
实际上,类模板和函数实现也不是不能分开到多个文件中,比如把函数实现和main()放到一个文家中,也是可以工作的。
三. 模板函数及成员函数和main()在同一个文件中
a.h文件
#include <iostream>
using namespace std ;
template <class T>
class Base
{
public :
T a ;
Base(T b)
{
a = b ;
}
T getA(){ return a ;} //类内定义
void setA(T c);
};
a.cpp
#include <iostream>
#include "a.h"
using namespace std ;
template <class T> //模板在类外的定义
void Base<T>::setA(T c)
{
a = c ;
}
int main(void)
{
Base <int>b(4);
cout<<b.getA()<<endl;
Base <double> bc(4);
bc.setA(4.3);
cout<<bc.getA()<<endl;
system("pause");
return 0 ;
}
四. main()文件引用cpp文件而不是.h文件
通过第3种方式,我们可以猜测,是不是引用cpp文件就可以了呢?
a.h文件
#include <iostream>
using namespace std ;
template <class T>
class Base
{
public :
T a ;
Base(T b)
{
a = b ;
}
T getA(){ return a ;} //类内定义
void setA(T c);
};
a.cpp文件
#include <iostream>
#include "a.h"
using namespace std ;
template <class T> //模板在类外的定义
void Base<T>::setA(T c)
{
a = c ;
}
main.cpp文件
#include "a.cpp"//注意,这里引用的cpp文件。
using namespace std;
int main(void)
{
Base <int>b(4);
cout<<b.getA()<<endl;
Base <double> bc(4);
bc.setA(4.3);
cout<<bc.getA()<<endl;
system("pause");
return 0 ;
}
可以正常运行。这说明,对于类模板的声明与实现放在不同文件中的情况,在main()函数使用时,需要引用类模板的实现所在的文件,而不是声明所在的文件。但这种方式明显不太好,所以还是建议把类模板的声明与实现放在一个文件中。
参考链接:https://blog.youkuaiyun.com/qq_37623612/article/details/79473627