C++泛型模板类使用小结

C++泛型模板类使用小结:
泛型类可以让源代码“实现”文件cc 和 头文件分离,书写规则只要遵循如下所示:
文件一:Test.h的泛型模版类的头文件
#include
#ifndef TEST_H
#define TEST_H
template
class Test{
    private:
        T t;
    public:
        void echo(void);       //这个方法就一个功能,把私有的T类型成员变量打印出来
        Test(T);
};
#include "Test.cc"            //注意这里,引入了他的"实现文件",代码“实现文件”那里再不需要include这个头文件了
#endif
文件二:Test.cc泛型模板类的方法函数等代码“实现文件” ,注意下暗红色地方
#include
template
void Test::echo(void){
    std::cout << t << std::endl;
}
template
Test::Test(T t){
    this->t = t;
}

文件三:main.cc客户端调用代码文件
#include
#include "Test.h"
using namespace std;
int main(){
   string line = "";
   getline(cin,line);
   while(line!="exit"){  //每次敲入一行,就输出一行
        Test t(line);
        t.echo();
        getline(cin,line);
   }
   return 0;
}

###############################################################
这里我们在做个改造实验,把T这个类型定义成我们自定义的Student类,并且重载他的<<输出操作符,然后让Test类来echo出来Student类
文件四:Student.h文件,将实现体也写在内了
#ifndef STUDENT_H
#define STUDENT_H
#include
using namespace std;
class Student{
    private:
        string name;
        unsigned int no;
    public:
        Student(string,int);
        Student();//注意这里:Student写上一个无参的构造函数,否则template模板类尖括号里面不能分配内存空间。Test 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
#include "Test.h"
#include "Student.h"
using namespace std;
int main(){
   string line = "";
   getline(cin,line);
   while(line!="exit"){
        Student stu(line,23);
        Test t(stu);  //把stu传入这个Test对象,其实更好的做法是Test的泛型的尖括号里使用Boost智能指针。
        t.echo();
        getline(cin,line);
   }
   return 0;
}

程序运行结果:
输入:hello
输出:hello : 23
输入:world
输出:world : 23

转载于:https://www.cnblogs.com/sharpstill/archive/2012/01/31/2333034.html

你可能感兴趣的:(C++泛型模板类使用小结)