Шаблонний принцип можна розширити і на класи. В цьому випадку шаблони звичайно використовуються, коли клас є сховищем даних. Прикладами таких класів є стеки, черги, списки.
Раніше ми створили клас stack для зберігання даних типу int. Бажано було б скласти аналогічний клас для зберігання даних типу long. Але ще краще було б скласти шаблон, який давав би нам змогу зберігати дані потрібного типпу «на вибір». Використаємо з цією метою концепцію шаблонів.
//реалізація стеку у вигляді шаблону
#include<iostream>
#include<conio.h>
using namespace std;
const int MAX=100;
template<class Type>
class Stack
{private:
Type st[MAX];
int top;
public:
Stack()
{top=-1;}
void push(Type var)
{st[++top]=var;
}
Type pop()
{return st[top--];}
};
/////////////
int main()
{ Stack<float> s1;
s1.push(1111.1F);
s1.push(2222.2F);
s1.push(3333.3F);
cout<<"1: "<<s1.pop()<<endl;
cout<<"2: "<<s1.pop()<<endl;
cout<<"3: "<<s1.pop()<<endl;
///////
Stack<long> s2;
s2.push(123123123L);
s2.push(234234234L);
s2.push(345345345L);
cout<<"1: "<<s2.pop()<<endl;
cout<<"2: "<<s2.pop()<<endl;
cout<<"3: "<<s2.pop()<<endl;
getch();
return 0;
}
Програма 14.3
Шаблонний аргумент Type використовується замість фіксованого типу у всіх місцях специфікації класу, де є посилання на тип масиву st.
Шаблони класів відрізняються від шаблонів функцій способом реалізації. Для створення шаблонної функції ми викликаємо її з аргументами потрібного типу. Натомість класи реалізуються за допомогою визначення об’єкта, що використовує шаблонний аргумент:
Stack<float> s1;
Такий вираз створює об’єкт s1. Це стек, в якому зберігаються числа типу float. У всіх його методах використовується тип float.
Створення об’єкту типу Stack, що зберігає об’єкти інших типів, як у виразі
Stack<long> s1;
означає не тільки резервування іншого об’єму пам’яті для даних, але й створення нового набору методів, що оперують типом long.