环境:ide:Mac+clion
视频链接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5
1.父类是模版类,子类继承的时候,需要明确T的类型。
2.如果为了灵活变化类型,那么子类也必须是模版类.
emplate<class T>
class Base{
public:
T t;
};
class Son1:public Base<int>{//父类是模版类,子类继承的时候,需要明确T的类型。
};
template<class T1,class T2>
class Son2:public Base<T2>{
public:
Son2(){
cout << "T1的类型是:"<< typeid(T1).name()<<endl;//T1的类型是:i
cout << "T2的类型是:"<< typeid(T2).name()<<endl;//T2的类型是:c
}
T1 t1;
};
void test(){
Son2<int,char> son2;
}
类模版中成员函数的类外实现
template<class T1,class T2>
class Person{
public:
Person(T1 name,T2 age);
T1 m_Name;
T2 m_Age;
void showPerson();
};
template<class T1,class T2>//这个需要写下来,让其知道T1 和 T2是类模版
Person<T1,T2>::Person(T1 name,T2 age){//这里记得在双冒号前面把类模版的类型加进去。
this->m_Name = name;
this->m_Age = age;
}
template<class T1,class T2>//这个需要写下来,让其知道T1 和 T2是类模版
void Person<T1,T2>::showPerson(){//这里记得在双冒号前面把类模版的类型加进去。
cout << "姓名:"<<this->m_Name<<"年龄:"<<this->m_Age<<endl;//姓名:sheik年龄:20
}
void test(){
Person<string,int>person("sheik",20);
person.showPerson();
}
类模版分文件编写:
由于类模版的成员函数都是调用的时候创建,那么引用.h文件是找不到相关的函数。为了解决这一问题,有两种方法可以解决:
1.直接引用类模版的cpp文件,类似于#include "*.cpp"
2.可以将类模版的h文件和cpp 写到一个文件中,统称为hpp文件,看到hpp文件就是类模版。
其中第二种方式是比较主流的解决这一问题的方式
#include <iostream>
using namespace std;
#ifndef CHAPTER6_PERSON_HPP
#define CHAPTER6_PERSON_HPP
template<class T1,class T2>
class Person{
public:
Person(T1 name,T2 age);
void showPerson();
T1 m_Name;
T2 m_Age;
};
template<class T1,class T2>
Person<T1,T2>::Person(T1 name,T2 age){
this->m_Name = name;
this->m_Age = age;
}
template<class T1,class T2>
void Person<T1,T2>::showPerson(){
cout <<"姓名:"<<this->m_Name<<"年龄:"<<this->m_Age<<endl;
}
#endif //CHAPTER6_PERSON_HPP
#include "person.hpp"
void test(){
Person<string,int>person("sheik",20);
person.showPerson();
}
类模版的友元,这里建议类内实现。而不要在全局实现。比较麻烦。
template<class T1, class T2>//这里让下面PersonT能看到定义。并且告知是一个模版类。
class PersonT;
template<class T1, class T2>//写这个让这个参数知道范型的类型。
void showPerson(PersonT<T1, T2> &p){
cout << "类外实现姓名:" << p.m_Name << " 年龄:" << p.m_Age << endl;
}
template<class T1, class T2>
class PersonT {
//这里直接通过friend 让这个函数升级为全局函数。可以直接调用。
// friend void showPerson(PersonT<T1, T2> &p) {
// cout << "类内实现姓名:" << p.m_Name << " 年龄:" << p.m_Age << endl;
// }
//通过全局函数来实现。这里添加一个声明,而且要在函数名后面加<>告知这要在类外实现。
friend void showPerson<>(PersonT<T1, T2> &p);
public:
PersonT(T1 name, T2 age) {
this->m_Name = name;
this->m_Age = age;
}
private:
T1 m_Name;
T2 m_Age;
};
void test() {
PersonT<string, int> p("sheik", 20);
showPerson(p);
}
网友评论