Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_33.doc
Скачиваний:
8
Добавлен:
16.11.2019
Размер:
88.58 Кб
Скачать

Шаблони класів : не лише для типів

Параметризувати деякий клас так, щоб він працював для будь-якого типу даних - це тільки половина того, що шаблони забезпечують для класів. Інший аспект полягає в тому, щоб дати можливість завдання числових параметрів. Це дозволяє Вам, наприклад, створювати об'єкти типів "Вектор з 20 цілих", "Вектор з 1000 цілих" або "Вектор з 10 змінних типу double".

Основна ідея проста, хоча використовуваний синтаксис може здатися складним. Давайте як приклад розглянемо деякий узагальнений клас Vector. Як і клас Pair, клас Vector містить функції Min(), Max(), isEqual(). Проте в нім може бути будь-яка кількість учасників, а не два. У класі Pair число учасників фіксоване і задаються вони як аргументи конструктора. У шаблоні Vector замість цього використовується другий параметр заголовка шаблону :

template <class T, int n> class Vector

{ public:

Vector();

~Vector() {delete[] coord;}

void newCoord (T x);

T Max ();

T Min();

int isEqual();

private:

T *coord;

int current;

};

Значення n, задане в заголовку шаблону не використовується в описі класу, але застосовується в описі його методів. Конструктор Vector, що використовує значення n для завдання розміру масиву, виглядає так:

// // конструктор

template <class T, int n>

Vector <T, n>::Vector() :

{ coord = new T[n];

current = 0;

}

// // метод Max

template <class T, int n>

T Vector <T, n>::Max() :

{ T result (coord[0]); // *

for (int i=0; i<n; i++)

if (result < coord[i]) //**

result = coord[i]; // ***

}

У конструкторі задається список ініціалізацій, що встановлюють початкові значення для двох елементів класу. Елемент coord ініціалізувався адресою динамічно розміщеного масиву розміром n і типу Т, що складається з елементів, а елемент current ініціалізувався значенням 0.

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

  1. конструктор копіювання (*)

  2. оператор < (**), і > для методу Max()

  3. оператор = (***).

Є декілька варіантів використання шаблонів з параметрами-значеннями для динамічного розміщення масивів різних розмірів. Наприклад, можна передати розмір масиву конструктору. Вказівка розмірів об'єкту під час конструювання або шляхом звернення до деякого методу дійсно забезпечує завдання розміру, проте такий спосіб не дозволяє створити окремий тип для кожного окремого розміру. Підхід з використанням шаблону гарантує, що розмір стає частиною типу. Так, Vector з п'ятьма елементами типу double є типом, відмінним від Vector з чотирма елементами типу double.

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

Хоча числові параметри шаблонів часто використовуються для завдання розмірів різних елементів, як це було показано для класу Vector, цим їх застосування не обмежується. Наприклад, за допомогою числових параметрів можна задавати діапазони значень графічних координат в графічному класі.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]