Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора II Sem.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
679.94 Кб
Скачать

7.2.4. Використання в узагальнених класах аргументів, що не є узагальненими типами

У template-специфікації для узагальненого класу можна також задавати аргументи, що не є узагальненими типами. Це означає, що в шаблонній специфікації можна вказувати те, що зазвичай приймається як стандартний аргумент, наприклад, аргумент типу int або аргумента-покажчика. Синтаксис (він практично такий самий, як під час задавання звичайних параметрів функції) містить визначення типу і імені аргумента. Ось, наприклад, як можна по-іншому реалізувати клас безпечного масиву, представленого в попередньому розділі.

Демонстрація механізму використання в узагальнених класах аргументів, що не є узагальненими типами

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

// Тут елемент int size – це аргумент, що не є узагальненими типом.

template <class aType, int size> class arrClass {

aType aMas[size]; // В аргументі size передається розмір масиву.

public:

arrClass() { for(int i=0; i<size; i++) aMas[i] = i; }

arrClass &operator[](int i);

};

// Забезпечення контролю меж для класу aType.

template <class aType, int size> aType & arrClass<aType, size>::operator[](int i)

{

if(i<0 || i> size-1) {

cout << "Значення індексу " << i << " за межами масиву" << endl;

exit(1);

}

return aMas[i];

}

int main()

{

arrClass<int, 10> ObjI; // 10-елементний масив цілих чисел

arrClass<double, 15> ObjD; // 15-елементний масив double-значень

cout << "Масив цілих чисел: ";

for(int i=0; i<10; i++) ObjI[i] = i;

for(int i=0; i<10; i++) cout << ObjI[i] << " ";

cout << endl;

cout << "Масив double-значень: ";

for(int i=0; i<15; i++) ObjD[i] = i/3.0;

for(int i=0; i<15; i++) cout << ObjD[i] << " ";

cout << endl;

ObjI[12] = 100; // Помилка тривалості виконання!

getch(); return 0;

}

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

Масив int-значень: 0 1 2 3 4 5 6 7 8 9

Масив double-значень: 0 0.333333 0.666667 1 1.333333 1.666667 2 2.333333 2.666667 3 3.333333 3.666667 4 4.333333 4.666667

Розглянемо уважно template-специфікацію для класу aType. Зверніть увагу на те, що аргумент size оголошений з вказанням типу int. Цей параметр потім використовують в тілі класу aType для оголошення розміру масиву aMas. Хоча у початковому коді програми член size має вигляд "змінної", його значення відоме вже при компілюванні. Тому його можна успішно використовувати для встановлення розміру масиву. Окрім цього, значення "змінної" size використовують для контролю виходу за межі масиву в операторній функції operator[](). Зверніть також увагу на те, як у функції main() створюється масив цілих чисел і масив значень з плинною крапкою. При цьому розмір кожного з них визначається другим параметром template-специфікації.

На тип параметрів, які не представляють типи, накладаються обмеження. У цьому випадку дозволено використовувати тільки цілочисельні типи, покажчики і посилання. Інші типи (наприклад, float) не допускаються. Аргументи, які передаються параметру, що не є узагальненими типом, повинні містити або цілочисельну константу, або покажчик, або посилання на глобальну функцію чи об'єкт. Таким чином, ці "нетипові" параметри необхідно розглядати як константи, оскільки їхні значення не можуть бути змінені. Наприклад, у тілі функції operator[]() така настанова недопустима:

size = 10; // Помилка

Оскільки параметри-"не типи" обробляються як константи, то їх можна використовувати для встановлення розміру масиву, що істотно полегшує роботу програмісту.

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

Шаблонний клас queueClass, представлено вище у цьому розділі, також виграв би від застосування до нього "нетипового" параметра, що задає розмір черги. Для домашньої вправи спробуйте удосконалити клас queueClass самостійно.

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