Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мет_2 часть_укр.doc
Скачиваний:
1
Добавлен:
09.11.2019
Размер:
938.5 Кб
Скачать

7.1.2. Шаблони класів

Створення шаблона функції має своєю метою відокремити алгоритм від конкретних типів даних, з якими функція працює. Тип даних передається на етапі компіляції як параметр функції. Аналогічний підхід може бути застосований і до класів. Для цього визначається шаблон класу, що може створювати сімейства родинних класів і застосовувати їх до декількох типів даних, передаючи тип як параметр. Синтаксис опису шаблона виглядає як

template <class Параметр_шаблона> class Ім'я_класу {

/*Члени_класу*/

};

У списку параметрів шаблона (у кутових дужках <...>) може бути кілька параметрів – тоді вони записуються через кому.

Приклад опису шаблона вектора (одновимірного масиву):

template <class T> class vector{

int i, num;

T *a;

public:

vector (int); //Конструктор

T find (int &); //Функція пошуку мінімального ел-та

void in();//Функція введення

void show();//Функція відображення

};

Методи (функції) шаблона автоматично є шаблонами функцій. Якщо метод описується поза шаблоном, треба дотримуватися синтаксису:

template <class Параметр_шаблона>

Тип_значення_що_повертається Ім'я_класу <Параметр_шаблона> :: Ім'я_функції (Список_параметрів_функції) {

/*Тіло_функції*/

}

7.1.3. Приклад. Методи шаблона вектора

Продовжимо розгляд шаблона класу вектора vector (див. попередній розділ) і визначимо методи, що фігурують в оголошенні цього класу. Конструктор класу-шаблона:

template <class T> vector <T> :: vector(int num){

a= new T[num];

vector :: num = num;

}

Функція введення значень елементів вектора:

template <class T> void vector <T> :: in() {

cout<<"Enter elements: ";

for (i=0; i<num; i++)

cin>>a[i];

}

Функція виведення елементів вектора на екран:

template <class T> void vector <T> :: show() {

for(i=0; i<num; i++)

cout<<a[i]<<" ";

cout<<endl;

}

Функція пошуку найменшого елемента; повертає значення цього елемента:

template <class T> T vector <T> :: find (int &min){

for (i=0; i<num; i++)

if (a[i]<a[min]) min=i;

return a[min];

}

Створення об'єкта-вектора (наприклад, цілочисельного масиву) і звертання до методів шаблона може виглядати так:

vector <int> arr (n);

arr.in();

arr.show();

int am = arr.find(min);

7.1.4. Приклад. Шаблон класу зв'язного списку

Параметрами шаблона можуть виступати не тільки стандартні типи даних, але й користувальницькі типи, наприклад, структура. Розглянемо приклад створення шаблона класу для списку (порівняйте з кодом у розд. "2.1.1. Списки"):

template <class T> class List {

T *pstart; //Покажчик початку списку

public:

List() { pstart=NULL; };

void add();

void display();

};

//Функція додавання вузла в список

template <class T> void List<T> :: add(){

T *temp; //Тимчасовий вузол

temp = new T;

cout << "Enter field1 : ";

cin >>temp->field1; //Введення значення в поле 1

cout << "Enter field2 : ";

cin >>temp->field2; //Введення значення в поле 2

temp->nxt = NULL; //Оскільки temp - останній вузол

//Зв'язування вузла із списком

if (pstart == NULL) pstart = temp;

else {

T *temp2; //Тимчасовий покажчик

temp2 = pstart; //Покажчик на початок списку

while (temp2->nxt != NULL) //Поки не кінець списку

temp2 = temp2->nxt;//перемістити покажчик

temp2->nxt = temp; //Прив'язати до списку новий вузол

}

}

//Функція відображення списку на екрані

template <class T> void List<T> :: display(){

T *temp;

temp = pstart;

cout << endl;

if (temp == NULL) //Якщо список порожній

cout << "The list is empty!" << endl;

else {

while (temp != NULL) {//Поки не кінець списку

cout << "field1 : " << temp->field1<< " ";

cout << "field2 : " << temp->field2<<endl;

temp = temp->nxt;

}

cout << "End of list!" << endl;

}

}

У цьому класі визначені функції додавання вузла в список (add) і відображення списку (display). Параметром шаблона T є тип даних вузла, наприклад, для списку "Блокнот" це може бути наступна структура:

struct node {

char field1[20];

long field2;

node *nxt;

};

Змінна field1 зберігає ім'я, а field2 – номер телефону. Тоді для створення об'єкта-списку потрібно записати:

List <node> mylist;

Якщо дані вузла містять не два (field1 і field2), а інше число полів, функції add і display потрібно видозмінити очевидним чином. Звернення до всіх полів структури як і раніше буде виконуватися через покажчик на вузол.