笑死,被设计中伤的又一个人,RIBEN相机打八折了,可是我兜里没钱哭死
目录
完蛋了,又是没学习的一天
0.4 类模板与继承
当子类继承的是父类的一个类模板时,子类在声明的时候,要制定出父类中的T的类型
如果不指定,编译器无法给子类分配内存
如果想灵活制定出父类中的T的类型,子类也需变为类模板
#include<iostream>
#include<string>
using namespace std;
template<class T>
class Base {
public:
T m;
Base() {
cout << "base T的数据类型是\t" << typeid(T).name() << endl;
}
};
//class Son:public Base { }; //无法继承,确实BASE的参数列表--必须知道父类的T的数据类型
class Son :public Base<int> {
};
template<class T1,class T2>
class Son2 :public Base<T2> {
public:
Son2() {
cout << "son2 T1的数据类型是\t" << typeid(T1).name() << endl;
cout << "son2 T2的数据类型是\t" << typeid(T2).name() << endl;
}
T1 obj;
};
void test01() {
Son s1;
Son2<int, char>s2;//int传给T1,char传给T2传给BASE的T
}
int main() {
test01();
system("pause");
return 0;
}
0.5 类模板成员函数类外实现
需要加上模板参数列表
#include<iostream>
#include<string>
using namespace std;
template<class T1,class T2>
class Person{
public:
Person(T1 name, T2 age);
/*{
this->_name = name;
this->_age = age;
}*/
void show();
//{
// cout << "name:\t" << this->_name >> "\tage:" << this->_age << endl;
//}
T1 _name;
T2 _age;
};
//构造函数类外实现
template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age) { //加作用域 + 指定传入<T1,T2>
this->_name = name;
this->_age = age;
}
//成员函数类外实现
template<class T1, class T2>
void Person<T1, T2>::show() {
cout << "name:\t" << this->_name<< "\tage:" << this->_age << endl;
}
void test01() {
Person<string, int> pp("土豆", 2);
pp.show();
}
int main() {
test01();
system("pause");
return 0;
}
0.6 类模板份文件编写
问题:类模板中成员函数的创建时机是在调用阶段,导致文件分文件编写是链接不到
解决:1,直接包含CPP源文件
2,将声明和实现写到同一个文件中,并更改后缀名为HPP,HPP是约定的名称,并不是强制
1,直接包含CPP源文件
person.h
#pragma once
#include<iostream>
#include<string>
using namespace std;
template<class T1, class T2>
class Person {
public:
Person(T1 name, T2 age);
void show();
T1 _name;
T2 _age;
};
person.cpp
#include "person.h"
template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age) { //加作用域 + 指定传入<T1,T2>
this->_name = name;
this->_age = age;
}
template<class T1, class T2>
void Person<T1, T2>::show() {
cout << "name:\t" << this->_name << "\tage:" << this->_age << endl;
}
a.cpp
#include<iostream>
#include<string>
//#include "person.h"//可以省略,但是这种办法本身不常用
#include "person.cpp"
using namespace std;
void test01() {
Person<string, int> pp("土豆", 2);
pp.show();
}
int main() {
test01();
system("pause");
return 0;
}
2,将声明和实现写到同一个文件中,并更改后缀名为HPP
person.hpp
#include<iostream>
#include<string>
using namespace std;
template<class T1, class T2>
class Person {
public:
Person(T1 name, T2 age);
void show();
T1 _name;
T2 _age;
};
template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age) { //加作用域 + 指定传入<T1,T2>
this->_name = name;
this->_age = age;
}
template<class T1, class T2>
void Person<T1, T2>::show() {
cout << "name:\t" << this->_name << "\tage:" << this->_age << endl;
}
a.c
#include<iostream>
#include<string>
#include "person.hpp"
using namespace std;
void test01() {
Person<string, int> pp("土豆", 2);
pp.show();
}
int main() {
test01();
system("pause");
return 0;
}
0.7 类模板与友元
类模板配合友元函数的类内,类外实现:
类内:直接在类内声明友元即可
类外:需要提前让编译器知道全局函数的存在——麻烦
#include<iostream>
#include<string>
//#include "person.hpp"
using namespace std;
template<class T1, class T2>
class Person;//看到PRINT02时编译器要知道有PERSON类
//类外实现,
template<class T1, class T2>//模板函数
void print02(Person<T1, T2> p) {
cout << "name:\t" << p._name << "\tage:" << p._age << endl;
}
template<class T1, class T2>
class Person {
//全局函数类内实现
friend void printperson(Person<T1,T2> p) {
cout << "name:\t" << p._name << "\tage:" << p._age << endl;
}
//全局函数类wai实现----加空模板参数列表,需要让编译器提前知道这个函数存在
friend void print02<>(Person<T1, T2> p);
public:
Person(T1 name, T2 age) {
this->_name = name;
this->_age = age;
}
void show();
private:
T1 _name;
T2 _age;
};
void test01() {
Person<string, int> pp("土豆", 2);
printperson(pp);
print02<>(pp);
}
int main() {
test01();
system("pause");
return 0;
}