C++语言程序设计 例9-2类模板应用举例 类 模# Include <iostream> include <cstdlib> 板 using namespace std ∥结构体 Student struct Student int id;∥学号 float gpa;∥平均分 x
C++语言程序设计 16 例9-2 类模板应用举例 #include <iostream> #include <cstdlib> using namespace std; // 结构体Student struct Student { int id; //学号 float gpa; //平均分 }; 类 模 板
J类模板:实现对任意类型数据进行存取 template <class T> class store i private T item;∥用于存放任意类型的数据 int have value;∥用于标记iem是否已被存入内容 public Store(void);∥默认形式(无形参)的构造函数 T GetElem(void);∥提取数据函数 void putelem(Tx);∥入数据函数 } ∥默认形式构造函数的实现 template <class T> Store<T>:: Store(void): have Value(0)1
//类模板:实现对任意类型数据进行存取 template <class T> class Store { private: T item; // 用于存放任意类型的数据 int haveValue; // 用于标记item是否已被存入内容 public: Store(void); // 默认形式(无形参)的构造函数 T GetElem(void); //提取数据函数 void PutElem(T x); //存入数据函数 }; // 默认形式构造函数的实现 template <class T> Store<T>::Store(void): haveValue(0) {} 17
template< class T>∥提取数据函数的实现 T Store<T>:: GetElem(void) ∥如果试图提取未初始化的数据,则终止程序 if(have Value==0) [ cout≤" No item present!"≤<endl exit(1); return item;∥返回item中存放的数据 template< class t>∥存入数据函数的实现 void Store<T>:: PutElem(T x) havevalue++;∥将 havevalue置为TRUE,表示 item中已存入数值 item=X, ∥将x值存入tem
template <class T> // 提取数据函数的实现 T Store<T>::GetElem(void) { // 如果试图提取未初始化的数据,则终止程序 if (haveValue == 0) { cout << "No item present!" << endl; exit(1); } return item; // 返回item中存放的数据 } template <class T> // 存入数据函数的实现 void Store<T>::PutElem(T x) { haveValue++; // 将haveValue 置为 TRUE,表示 item中已存入数值 item = x; // 将x值存入item } 18
int maino i Student g=(1000, 23], 百从一个类 Store<int> s1 S2 板创建类时, Store<Student> S3 必须提供 Store<double> d: 具体类型以完 成新类型的定 S1 PutElem (3) S2. PutElem(-7) cout≤<S1. GetElem(<""≤<S2 GetElem()<endl; S3. PutElem(g) cout << The student id is"<< S3 GetElem( id < endl; cout <<Retrieving object D; cout<< D, GetElem()<<endl;∥输出对象D的数据成员 ∥由于D未经初始化在执行函数 D GetElement(0时出错
int main() { Student g= {1000, 23}; Store<int> S1, S2; Store<Student> S3; Store<double> D; S1.PutElem(3); S2.PutElem(-7); cout << S1.GetElem() << " " << S2.GetElem() << endl; S3.PutElem(g); cout << "The student id is " << S3.GetElem().id << endl; cout << "Retrieving object D " ; cout << D.GetElem() << endl; //输出对象D的数据成员 // 由于D未经初始化,在执行函数D.GetElement()时出错 } 19 当从一个类模 板创建类时, 必须提供一个 具体类型以完 成新类型的定 义
C++语言程序设计 和函数模板一样,可以创建模板类的显式特化。 template <class t> class zRFClass [TX; public ZRFClass(T a)ix=a; y T getx([ return X; 3 } template<> class ZRFClass<int>∥为类型int显式特化 i int x; public: ZRFClass(int a)ix=a*a; y int geti return X;] x }
C++语言程序设计 20 和函数模板一样,可以创建模板类的显式特化。 template <class T> class ZRFClass { T x; public: ZRFClass(T a) {x = a; } T getx() { return x; } }; template <> class ZRFClass<int> //为类型int显式特化. { int x; public: ZRFClass(int a) {x = a * a; } int getx() { return x; } };