Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.08 Mб
Скачать
  1. Використання в узагальнених класах аргументів, що не є узагальненими типами

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

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

#include <vcl>

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

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

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

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

template <class аТуре, int size> class arrClass {

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

public:

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

};

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

template <class аТуре, int size> аТуре & arrClass<aType, size>::operator[](int і)

{

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

cout « "Значення індексу " « і « " за межами масиву" « endl; exit(1);

}

return aMas[i];

}

int mainO

{

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

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

cout « "Масив цілих чисел: for(int і=0; і<10; І++) Objl[i] = і; for(int і=0; і<10; І++) cout « Objl[i] cout « endl;

cout « "Масив double-значень: "; for(int i=0; i<15; І++) ObjD[i] = i/3.0; for(int i=0; i<15; І++) cout « ObjD[i] « " "; cout « endl;

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

}

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

Масив int-значень: 0123456789

Масив doubte-значень: 0 0.333333 0.666667 1 1.333333 1.666667 2 2.333333 2.666667 З 3.333333 3.666667 44.3333334.666667

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

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

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

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

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

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