InStack 和 CharStack 的共同属性可以用另一种不同的方式来表达,这就是C++的模板机制。模板也被称之为参数化类型,在如下列代码中给出了堆栈的模板。
const int defautStack = 128;
template <class T>
class Stack {
int size;
int top;
T *data;
public:
Stack(int size = defaultStack);
~Stack();
void push(T);
T pop();
};
template <class T>
Stack<T> ::Stack(int s)
{
size = s;
top =0;
data = new T [size];
}
tempate <class T>
Stack<T>::~Stack()
{
delete [] data;
}
template <class T>
void Stack<T>::push(T d)
{
assert(top<size);
data[top++] = d;
}
template <class T>
T Stack<T>::pop()
{
assert (top >0);
return data[--top];
}
Stack 模板定义了一组类。在使用 Stack 模板来声明一个对象时,必须同时提供一个类型来替换模板声明中的类型 T。例如,
Stack<char> stackofChar(10);
在上面的语句中,我们声明了一个对象 stackofChar ,这个对象是一个存储10个char 类型值的堆栈,而在下面的语句中:
Stack<int> stackofInt(20);
我们声明了一个对象 stackofInt ,这个对象是一个存储20个int 类型值的堆栈。函数push()中的参数类型和pop() 的返回类型也都是 T。
将模板增加到C++ 的主要推动力是因为模板可以支持通用的集合类。我们不仅可以创建整数类型的堆栈和字符类型的堆栈,还可以创建浮点类型的堆栈, char指针类型的堆栈等等。
用模板来实例化的对象与那些使用 IntStack 和CharStack来实例化的对象在行为上只是存在细微的差别。在最初的 CharStack 构造函数中,可以带有第二个参数,用于指定将要压入栈中的字符串。但是 IntStack 的构造函数中并没有这个参数。因此,如果使用模板来同时表示这两个类,那么这个差别将是无法被表达出来的。