如何寫模板類?(模板類的簡單例子)
阿新 • • 發佈:2018-12-18
本文通過c++ primer plus中的例子來學習寫模板類.
1.為什麼需要模板類?
為了滿足程式碼重用的需求. 比如stack類,希望不同的型別都能用. 先看看用typedef 定義的stack類.
// stack.h -- class definition for the stack ADT #ifndef STACK_H_ #define STACK_H_ typedef unsigned long Item; class Stack { private: enum {MAX = 10}; // constant specific to class Item items[MAX]; // holds stack items int top; // index for top stack item public: Stack(); bool isempty() const; bool isfull() const; // push() returns false if stack already is full, true otherwise bool push(const Item & item); // add item to stack // pop() returns false if stack already is empty, true otherwise bool pop(Item & item); // pop top into item }; Stack::Stack() // create an empty stack { top = 0; } bool Stack::isempty() const { return top == 0; } bool Stack::isfull() const { return top == MAX; } bool Stack::push(const Item & item) { if (top < MAX) { items[top++] = item; return true; } else return false; } bool Stack::pop(Item & item) { if (top > 0) { item = items[--top]; return true; } else return false; } #endif
此時能操作的型別是unsigned long;現在如果希望stack還能夠操作string,該怎麼辦呢? 如果還用typedef定義,就要多一份類似的程式碼. 這個時候模板類就發揮作用了.
2.改寫為模板類
使用模板類改寫stack如下
// stacktp.h -- a stack template #ifndef STACKTP_H_ #define STACKTP_H_ template <class Type> class Stack { private: enum {MAX = 10}; // constant specific to class Type items[MAX]; // holds stack items int top; // index for top stack item public: Stack(); bool isempty(); bool isfull(); bool push(const Type & item); // add item to stack bool pop(Type & item); // pop top into item }; template <class Type> Stack<Type>::Stack() { top = 0; } template <class Type> bool Stack<Type>::isempty() { return top == 0; } template <class Type> bool Stack<Type>::isfull() { return top == MAX; } template <class Type> bool Stack<Type>::push(const Type & item) { if (top < MAX) { items[top++] = item; return true; } else return false; } template <class Type> bool Stack<Type>::pop(Type & item) { if (top > 0) { item = items[--top]; return true; } else return false; } #endif
(1)將typedef替換為template <class Type>
,關鍵字template告訴編譯器要定義一個模板,尖括號內容相當於函式的引數列表.class相當於變數的型別名,Type相當於變數的值,變數接受型別作為其值.
(2)使用泛型名Type替換識別符號Item,Type是一個通用型別說明符,在使用模板是將使用實際型別替代它.
(3)在每個函式前面使用模板宣告template <class Type>
打頭.並且在類名後面要<Type>
對比stack建構函式,未使用模板類前,
Stack::Stack() // create an empty stack { top = 0; }
使用模板類後
template <class Type>
Stack<Type>::Stack()
{
top = 0;
}
3.使用
使用的時候給類傳遞型別名就可以了
Stack<int> kernels;
Stack<string> colonels;