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

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

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

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

#include <vcl>

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

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

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

template <class aType, class bType> class myClass {

aType c;

bType d;

public:

myClass(aType ObjA, bType ObjB) { c = ObjA; d = ObjB; }

void showType()

{cout << "c= " << c << "; d= " << d << endl; }

};

int main()

{

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

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

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

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

getch(); return 0;

}

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

c= 10; d= 0.23

c= x; d= Це тест.

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

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

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

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

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

#include <vcl>

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

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

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

const int size = 10;

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

aType aMas[size];

public:

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

arrClass &operator[](int i);

};

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

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

{

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

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

exit(1);

}

return aMas[i];

}

int main()

{

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

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

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

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

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

cout << endl;

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

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

for(int i=0; i<size; 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

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