C++泛型模板类使用小结
C++泛型模板类使用小结:
泛型类可以让源代码“实现”文件cc 和 头文件分离,书写规则只要遵循如下所示:
文件一:Test.h的泛型模版类的头文件
#include <iostream>
#ifndef TEST_H
#define TEST_H
template <typename T>
class Test{
private:
T t;
public:
void echo(void); //这个方法就一个功能,把私有的T类型成员变量打印出来
Test(T);
};
#include "Test.cc" //注意这里,引入了他的"实现文件",代码“实现文件”那里再不需要include这个头文件了
#endif
文件二:Test.cc泛型模板类的方法函数等代码“实现文件” ,注意下暗红色地方
#include <iostream>
template<typename T>
void Test<T>::echo(void){
std::cout << t << std::endl;
}
template<typename T>
Test<T>::Test(T t){
this->t = t;
}
文件三:main.cc客户端调用代码文件
#include <iostream>
#include "Test.h"
using namespace std;
int main(){
string line = "";
getline(cin,line);
while(line!="exit"){ //每次敲入一行,就输出一行
Test<string> t(line);
t.echo();
getline(cin,line);
}
return 0;
}
###############################################################
这里我们在做个改造实验,把T这个类型定义成我们自定义的Student类,并且重载他的<<输出操作符,然后让Test类来echo出来Student类
文件四:Student.h文件,将实现体也写在内了
#ifndef STUDENT_H
#define STUDENT_H
#include <iostream>
using namespace std;
class Student{
private:
string name;
unsigned int no;
public:
Student(string,int);
Student();//注意这里:Student写上一个无参的构造函数,否则template模板类尖括号里面不能分配内存空间。Test<Student> t会调用一下这个构造函数。
string getName() const {return this->name;}
unsigned getNo() const{return this->no;}
friend ostream& operator<<(ostream&,const Student&); //输入>>输出<<操作符重载的时候只能friend,而且ostream&把&符号放在后面!
};
//注意下面这个地方的"初始化列表的顺序":先把形参列表放前面,再:后初始化列表
Student::Student(string _name,int _no):name(_name),no(_no){
}
Student::Student(){} //为了泛型Test<Student> t
ostream& operator << (ostream& output,const Student& stu){ //实现该函数原型时注意3点:1.不用写Student::因为不是该类对象的方法,2.不用写friend字样,3.而且仍然ostream&把&符号放在后面!
output << stu.getName() << " : " << stu.getNo();
return output;
}
#endif
修改文件三:main函数的客户端文件,让Test的echo出Student对象
#include <iostream>
#include "Test.h"
#include "Student.h"
using namespace std;
int main(){
string line = "";
getline(cin,line);
while(line!="exit"){
Student stu(line,23);
Test<Student> t(stu); //把stu传入这个Test对象,其实更好的做法是Test的泛型的尖括号里使用Boost智能指针。
t.echo();
getline(cin,line);
}
return 0;
}
程序运行结果:
输入:hello
输出:hello : 23
输入:world
输出:world : 23
浙公网安备 33010602011771号