Розглянемо ще один приклад, в якому шаблони допомагають при створенні класів-сховищ даних. Для цього модифікуємо програму, що описує, створює і зберігає зв’язні списки. Будемо добиватися, щоб не тільки клас linklist був перероблений в шаблон, але щоб і структура link, яка реально зберігає кожен елемент даних, теж стала шаблоном.
//шаблон звязних списків
#include<iostream>
#include<conio.h>
using namespace std;
///////////
template<class TYPE>
struct link
{TYPE data;
link* next;
};
/////////
template<class TYPE>
class linklist
{ private:
link<TYPE>*first;
public:
linklist()
{first=NULL;}
void additem(TYPE d);
void display();
};
/////////
template<class TYPE>
void linklist<TYPE>::additem(TYPE d)
{link<TYPE>* newlink=new link<TYPE>;
newlink->data=d;
newlink->next=first;
first=newlink;
}
template<class TYPE>
void linklist<TYPE>::display()
{
link<TYPE>* current=first;
while(current!=NULL)
{cout<<endl<<current->data;
current=current->next;
}
}
/////////
int main()
{
linklist<double> ld;
ld.additem(101.5);
ld.additem(202.5);
ld.additem(303.7);
ld.display();
linklist<char>lch;
lch.additem('a');
lch.additem('b');
lch.additem('c');
lch.display();
cout<<endl;
getch();
return 0;
}
Програма 14.5
В main() ми визначаємо два зв’язних списки: один — для зберігання чисел типу doublr, інший — для зберігання символів (типу char). В кожен з них заносимо по три значення за допомогою методу additem() і виводимо всі значення на екран за допомогою display().
І клас linklist, і структура link використовуються шаблонним аргументом TYPE для підстановки довільного типу даних. Таким чином, не тільки linklist, але й link повинні бути саме шаблонами і починатися з рядка:
template<class TYPE>
Взагалі не тільки класи й функції, а будь-які елементи програми, що використовують типи даних, можуть бути перетворені в шаблони.
Як і раніше, необхідно слідкувати за найменуванням класу (і структури) в різних частинах програми. Всередині його власної специфікації ми використовуємо тільки найменування класу (чи структури). У зовнішніх методах ми пишемо ім’я класу, а за ним — ім’я шаблонного аргументу
linklist<TYPE>
Нарешті, коли ми визначаємо об’єкти класу, ми вже використовуємо конкретний потрібний тип даних, що відображається у записі виразу.
linklist<double> ld;