类模板
1、目的:
定义可以存放任意类型对象的通用容器类。
如一个可以存放任何数据类型的链表,一个可以存放int, double, string等甚至未知类型的栈(stack)。
2、实现方式:
为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型。
3、格式:
template < 模板形参表 >
class 类模板名
{ 类成员声明 };
其中,模板形参表形式如下:
typename 模板形参1, typename 模板形参2, …
在类模板以外定义其成员函数,则函数首部形式如下:
template <模板形参表>
返回值类型 类模板名 <模板形参名列表>::函数名( 函数形参表 )
4、类模板的实例化:
类模板是一个通用类模型,而不是具体类,不能用于创建对象,只有经过实例化后才得到具体类,才能用于创建对象。
• 实例化的一般形式:
类模板名 < 模板实参表 >
• 模板实参是一个实际类型。
• 一个类模板可以实例化为多个不同的具体类。
Stack<int> stack_int;
Stack<double> stack_double;
Stack<string> stack_string;
5、一个例子:
//genericStack.h:
template <typename ElementType>
class Stack {
public:
Stack();
~Stack();
void push(ElementType obj) throw(std::bad_alloc);
void pop() throw(std::logic_error);
ElementType getTop() const throw(std::logic_error);
bool isEmpty() const;
private:
struct Node {
ElementType element;
Node* next;
};
Node* top;
};
//genericStack.cpp:
#include “genericStack.h”
template <typename ElementType>
void Stack<ElementType>::push( ElementType obj )
{
Node* temp;
temp = new Node;
temp -> element = obj;
temp -> next = top;
top = temp;
}
template <typename ElementType>
void Stack<ElementType>::pop()
{
Node* temp;
if (top != NULL) {
temp = top;
top = top -> next;
delete temp;
}
else {
return;
}
}
#include “genericStack.h”
int main()
{
Stack<int> stack; // 实例化一个保存int型元素的栈
for (int i = 1; i < 9; i++) // 向栈中压入8个元素
stack.push(i);
while (!stack.isEmpty()) { // 栈不为空时循环
cout << stack.getTop() << " "; // 显示栈顶元素
stack.pop(); // 弹出栈顶元素
}
}
声明:以上整理自个人理解和中山大学万海讲师上课内容。