在程序设计中往往尊在这样的两种情况,一种是两个或多个函数的程序结构相同,区别仅在于其参数类型或函数返回类型不同;另一种是两个或多个类的结构相同,差别仅在于部分类的成员的类型或成员函数的类型及参数的类型不同。不论哪种情况,其程序框架都基本相同,只是具体细节不同。
C++提供了模板机制,利用这一机制,可简化程序代码,实现软件复用。C++有两种模板类型:
(1)函数模板:是一种抽象通用的函数,用它可生成一批具体的函数。这些由函数模板经实例化生成的具体函数成为模板。
(2)类模板:是一种抽象通用的类,用它可生成一批具体的类。这些类模板经实例化生成的具体的类成为模板类。
下面通过一个具体的例子来理解模板。
实验内容:
根据已知的Stack<T>类
Stack<T> |
-element[100]:T -size:int |
+Stack() +empty():bool +peek():T +push(value:T):void +pop():T +getSize():int |
(1) 向Stack类添加一个实例函数printStack,以打印栈中所有元素。
(2) 为Stack类添加一个实例函数contains(T element),检查给定元素是否在栈中。
源代码
Stack.h
#include<iostream>
using namespace std;
template <class T>
class Stack
{
Telement[100];
intsize;
public:
Stack();
boolempty();
Tpeek();
voidpush(T value);
Tpop();
intgetsize();
voidprintStack();
bool contains(T element);
};
template <class T>
Stack<T>::Stack()
{
size=0;
}
template <class T>
bool Stack<T>::empty()
{
if(size==0)
returntrue;
else
returnfalse;
}
template <class T>
int Stack<T>::getsize()
{
returnsize;
}
template <class T>
T Stack<T>::peek()
{
returnelement[size-1];
}
template <class T>
T Stack<T>::pop()
{
if(size<1)
cout<<"栈空!"<<endl;
else
{
size=size-1;
returnelement[size];
}
}
template <class T>
void Stack<T>::push(T value)
{
element[size]=value;
size++;
}
template <class T>
bool Stack<T>::contains(T element)
{
for(inti=0;i<100;i++)
{
if(element==this->element[i])
returntrue;
}
returnfalse;
}
template <class T>
void Stack<T>::printStack()
{
while(!empty())
{
cout<<pop()<<"";
}
}
Main.cpp
#include<iostream>
#include"Stack.h"
using namespace std;
int main()
{
Stack<int>stack1;
for(int i=1;i<=10;i++)
{
stack1.push(i);
}
cout<<"栈中所有元素如下:"<<endl;
stack1.printStack();
cout<<endl;
cout<<"栈中是否有数字2 ?"<<stack1.contains(2)<<endl;
cout<<"栈中是否有数字11 ?"<<stack1.contains(11)<<endl;
return0;
}