Void main(). List<int> List_int;

{

List<int> List_int;

List_int.add(5);

List_int.add(4);

List_int.insert(5,25);

List_int.insert(25,100);

List_int.print();

List_int.print_back();

List_int.remove(25);

List_int.print();

}

 

Результат роботи програми:

 

list 5 25 100 4

list back 4 100 25 5

list 5 100 4

 

У функції main() створюється за допомогою шаблону об'єкт List_int (цей процес називається інстанціюванням). У загальному вигляді при описі об'єкту після імені шаблону в кутових дужках перераховуються його аргументи:

 

ім’я_шаблону <аргументи>

ім’я_об’єкта [(параметри_конструктору)];

 

При використанні параметрів шаблону за умовчанням список аргументів може виявитися порожнім, при цьому кутові дужки опускати не можна:

 

tempiate<class Т = char> class String;

String <>* p;

 

Для спрощення використання шаблонів класів можна застосувати перейменування типів за допомогою typedef:

 

typedef List <double> Ldb1;

Ldb1 List_double;

 

Ми розглянули приклад коли клас Node знаходиться усередині класу List. Якщо ці класи представлені роздільно, тоді опис класу двохзв’язного списку матиме наступний вигляд:

 

#include <iostream>

using namespace std;

 

template <class Data> class Node

{

public:

Data d;

Node* next;

Node* prev;

Node (Data dat = 0)

{

d = dat;

next = 0;

prev = 0;

}

};

 

template <class Data> class List

{

Node<Data>* pbeg,*pend;

public:

List(){pbeg = 0;pend=0;}

~List();

void add(Data d);

Node<Data>* find(Data i);

bool remove (Data key);

Node<Data>* insert(Data key, Data d);

void print();

void print_back();

};

 

template <class Data>

List<Data>::~List()

{

if(pbeg!=0)

{

Node<Data>* pv = pbeg;

while(pv)

{

pv = pv->next;

delete pbeg;

pbeg = pv;

}

}

}

 

template <class Data>

void List<Data>::print()

{

Node<Data>* pv = pbeg;

cout << char(10) << " list ";

 

while(pv)

{

cout << pv->d << " ";

pv = pv->next;

}

cout << char(10);

}

 

template <class Data>

void List<Data>::print_back()

{

Node<Data>* pv = pend;

cout << char(10) << " list back ";

while(pv)

{

cout << pv->d << " ";

pv = pv->prev;

}

cout << char(10);

}

 

template <class Data>

void List<Data>::add(Data d)

{

Node<Data>* pv = new Node<Data>(d);

if(pbeg == 0)pbeg = pend = pv;

else

{

pv->prev = pend;

pend->next = pv;

pend = pv;

}

}

 

template <class Data>

Node<Data>* List<Data>::insert(Data key,Data d)

{

if(Node<Data>*pkey = find(key))

{

Node<Data>* pv = new Node<Data>(d);

pv->next = pkey->next;

pv->prev = pkey;

pkey->next = pv;

if(pkey!=pend)(pv->next)->prev = pv;

else pend = pv;

return pv;

}

return 0;

}

 

template <class Data>

Node<Data>* List<Data>::find(Data d)

{

Node<Data> *pv = pbeg;

while(pv)

{

if(pv->d == d)break;

pv = pv->next;

}

return pv;

}

 

template <class Data>

bool List<Data>::remove(Data key)

{

if(Node<Data>*pkey = find(key))

{

if (pkey == pbeg)

{

pbeg = pbeg->next;

pbeg->prev = 0;

}

else if (pkey == pend)

{

pend = pend->prev;

pbeg->next = 0;

}

else

{

(pkey->prev)->next = pkey->next;

(pkey->next)->prev = pkey->prev;

}

delete pkey;

return true;

}

return false;

}

 

При визначенні синтаксису шаблону було сказано, що в нього, окрім типів і шаблонів, можуть передаватися змінні. Вони можуть бути цілого або перерахованого типу, а також вказівками або посиланнями на об'єкт або функцію. У тілі шаблону вони можуть застосовуватися в будь-якому місці, де допустимо використовувати константний вираз. Як приклад створимо шаблон класу, що містить блок пам'яті певної довжини і типу:

 

template <class Type, int kol>








Дата добавления: 2014-12-26; просмотров: 725;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.023 сек.