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

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

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

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

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

#include <vcl>

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

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

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

const int size = 10;

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

aType aMas[size]; public:

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

arrClass &operator[](int i);

};

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

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

{

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

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

}

return aMas[i];

}

Int mainO

{

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

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

cout « "Масив int-значень: for(int і=0; i<size; І++) Objl[i] = і; for(int i=0; i<size; i++) cout « Objl[i] cout « endl;

cout « "Масив double-значень: for(int i=0; i<size; І++) ObjD[i] = i/3.0; for(int i=0; i<size; І++) 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 З

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