1. 程式人生 > >模板之類模板

模板之類模板

class 函數模板 創建 pop 基本 pty pub spa ack

類模板:將類定義中的數據類型參數化。類模板實際上是函數模板的推廣,可以用相同的類模板來組建任意類型的對象集合。

使用類模板,類模板的實例化:用具體的數據類型替換模板參數以得到具體的類。模板類也可以實例化為對象,用下列方式創建類模板的實例:

類名 <類型實參表> 對象名稱

函數模板可以自動推導,類模板只能顯示實例化。

下面以一個stack模板類來介紹模板的基本用法:

 1 #pragma once
 2 #include<exception>
 3 template <typename T>
 4 class Stack
 5 {
 6 public:
 7
Stack(int maxSize); 8 ~Stack(); 9 void push(const T& elem); 10 void pop(); 11 T& top(); 12 const T& top() const; 13 bool empty() const; 14 private: 15 T* elem_; 16 int maxSize_;//棧最大元素個數 17 int top_;//保存棧頂位置 18 }; 19 template<typename T> 20 Stack<T>::Stack(int
maxSize) :maxSize_(maxSize),top_(-1) 21 { 22 elem_ = new T[maxSize_]; 23 } 24 template<typename T> 25 Stack<T>::~Stack() 26 { 27 delete[] elem_; 28 } 29 template<typename T> 30 void Stack<T>::push(const T& elem) 31 { 32 if (top_ + 1 >= maxSize_) 33 throw
out_of_range("stack<>::push satck full"); 34 elem_[++top_] = elem; 35 } 36 template<typename T> 37 void Stack<T>::pop() 38 { 39 if (top_ + 1 <= 0) 40 throw out_of_range("stack<>::pop stack empty"); 41 --top_; 42 } 43 template<typename T> 44 T& Stack<T>::top() 45 { 46 if (top_ + 1 == 0) 47 throw out_of_range("stack<>::top() stack empty"); 48 return elem_[top_]; 49 } 50 template<typename T> 51 const T& Stack<T>::top() const 52 { 53 if (top_ + 1 == 0) 54 throw out_of_range("stack<>::top() stack empty"); 55 return elem_[top_]; 56 } 57 template<typename T> 58 bool Stack<T>::empty() const 59 { 60 return top_ + 1 == 0; 61 } 62 63 #include<iostream> 64 #include "Stack.h" 65 using namespace std; 66 67 68 int main(void) 69 { 70 Stack<int> s(10); 71 s.push(1); 72 s.push(2); 73 s.push(3); 74 while (!s.empty()) 75 { 76 cout << s.top() << endl; 77 s.pop(); 78 } 79 return 0; 80 }

下面對上述類模板進行改進,引入非類型參數:

#pragma once
#include<exception>
//類模板也可以傳遞非類型參數
template <typename T,int MAX_SIZE>
class Stack
{
public:
    Stack();
    ~Stack();
    void push(const T& elem);
    void pop();
    T& top();
    const T& top() const;
    bool empty() const;
private:
    T* elem_;
    //int maxSize_;//棧最大元素個數
    int top_;//保存棧頂位置
};
template <typename T, int MAX_SIZE>
Stack<T,MAX_SIZE>::Stack() :top_(-1)
{
    elem_ = new T[MAX_SIZE];  
}
template <typename T, int MAX_SIZE>
Stack<T, MAX_SIZE>::~Stack()
{
    delete[] elem_;
}
template <typename T, int MAX_SIZE>
void Stack<T, MAX_SIZE>::push(const T& elem)
{
    if (top_ + 1 >= MAX_SIZE)
        throw out_of_range("stack<>::push satck full");
    elem_[++top_] = elem;
}
template <typename T, int MAX_SIZE>
void Stack<T, MAX_SIZE>::pop()
{
    if (top_ + 1 <= 0)
        throw out_of_range("stack<>::pop stack empty");
    --top_;
}
template <typename T, int MAX_SIZE>
T& Stack<T, MAX_SIZE>::top()
{
    if (top_ + 1 == 0)
        throw out_of_range("stack<>::top() stack empty");
    return elem_[top_];
}
template <typename T, int MAX_SIZE>
const T& Stack<T, MAX_SIZE>::top() const
{
    if (top_ + 1 == 0)
        throw out_of_range("stack<>::top() stack empty");
    return elem_[top_];
}
template <typename T, int MAX_SIZE>
bool Stack<T,MAX_SIZE>::empty() const
{
    return top_ + 1 == 0;
}

模板之類模板