1. 程式人生 > >如何寫模板類?(模板類的簡單例子)

如何寫模板類?(模板類的簡單例子)

本文通過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;