持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
1、类模板
与函数模板一样,有些类的结构非常相似,只是在数据类型上有所差别,这个时候就可以使用类模板是代码重复利用。 他记得基本语法也跟函数模板很相似:
//在这条语句下的函数就是函数模板,在这条语句下的类就是类模板
template<class T>//提前告诉编译器 T 是某个数据类,让编译器不要报错
class Base
{
public:
T m;
};
2、类模板的继承
类模板也可以被继承但是要指明T的数据类型才能继承,或者把子类也形成类模板
template<class T>
class Base
{
T m;
};
class Son :public Base<int>//指明T的数据类型之后继承类模板
{
};
把子类也变成类模板就可以灵活的指令T是那种数据类型
template <class T1, class T2>//想灵活的指令T,子类也要是模板
class Son2 :public Base<T2
{
public:
Son2()
{
cout << "T1的类型为:" << typeid(T1).name() << endl;
cout << "T2的类型为:" << typeid(T2).name() << endl;
}
T1 n;
};
3、类模板构造函数与成员函数的的类外实现
我们知道,类的成员函数可以写在类的外面,这样当类的函数比较多的时候,我们只要在类中写函数的声明即可。 具体细节如下,注意看注释:
//成员函数的类外实现
template<class T1, class T2>
class Person
{
public:
T1 name;
T2 age;
Person(T1 name, T2 age);
void show();
};
//构造函数的类外实现
template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age)
{
this->name = name;
this->age = age;
cout << "姓名 " << this->name << " 年龄" << this->age;
}
//成员函数的类外实现
template<class T1, class T2>
void Person<T1, T2>::show()
{
cout << "姓名 " << this->name << " 年龄" << this->age << endl;
}
4、模板类的分文件编写
分文件编写就是把一个完成的项目代码分写到多个文件中,一般是一个.cpp文件里面是主函数,一个或多个.h头文件,包括函数的声明、宏定义、结构体定义、类的声明等等,和一个或多个.cpp文件去实现头文件里面的函数声明,同时.cpp包含.h头文件进行链接。但是由于类模板的成员函数的创建时机是在调用成员函数的时候创建的,因为此时我们已经指定了T的数据类型。所以分文件编写的时候链接不到成员函数。
解决方案有两个,第一种是将.h头文件和.cpp(函数声明的文件)写在同一个文件之中。第二种是将函数声明的.cpp文件直接include 到主函数.cpp中,.h文件就用放进去了,因为函数声明.cpp文件中有.h文件。