Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

17.2.2. Створення класу з двома узагальненими типами даних

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

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

#include <vcl>

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

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

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

template <class aType, class bType> class myClass {

aType izm;

bType jzm;

public:

myClass(aType a_ob, bType b_ob) { izm = a_ob; jzm = b_ob;}

void showType()

{cout << "izm= " << izm << "; jzm= " << jzm << "\n";}

};

int main()

{

myClass<int, double> A_ob(10, 0.23);

myClass<char, char *> B_ob('x', "Це тест.");

A_ob.showType(); // Відображення int- і double-значень

B_ob. showType (); // Відображення значень типу char і char *

getch(); return 0;

}

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

izm= 10; jzm= 0.23

izm= x; jzm= Це тест.

У цій програмі оголошується два види об'єктів. Об'єкт A_ob використовує дані типу int і double, а об'єкт B_ob – символ і покажчик на символ. Для цих ситуацій компілятор автоматично генерує дані та функції відповідного способу побудови об'єктів.

17.2.3. Створення узагальненого класу для організації безпечного масиву

Перш ніж рухатися далі, розглянемо ще одне застосування узагальненого класу. Як було показано в розд. 14, можна перевантажувати оператор "[]", що дає змогу створювати власні реалізації масивів, у тому числі і "безпечні масиви", які забезпечують динамічну перевірку порушення його меж. Як уже зазначалося вище, у мові програмування C++ у процесі виконання програми можливий вихід за межі масиву без видачі повідомлення про помилку. Але, якщо створити клас, який би містив масив, і дати змогу доступ до цього масиву тільки через перевантажений оператор індексації ("[]"), то можна перехопити індекс, що відповідає адресі за межами адресного простору масиву.

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

Код програми 17.8. Демонстрація створення і використання узагальненого безпечного масиву

#include <vcl>

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

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

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

const int size = 10;

template <class aType> class atype { // Оголошення класового типу

aType aMas[size];

public:

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

aType &operator[](int i);

};

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

template <class aType> aType &atype<aType>::operator[](int i)

{

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

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

exit(1);

}

return aMas[i];

}

int main()

{

atype<int> I_ob; // Масив int-значень

atype<double> D_ob; // Масив double-значень

int i;

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

for(i=0; i<size; i++) I_ob[i] = i;

for(i=0; i<size; i++) cout << I_ob[i] << " ";

cout << "\n";

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

for(i=0; i<size; i++) D_ob[i] = (double) i/3;

for(i=0; i<size; i++) cout << D_ob[i] << " ";

cout << "\n";

I_ob[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

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