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

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

У наведеному нижче коді програми клас chergaClass (вперше представлено в розд. 12) перероблений в узагальнений клас з одним узагальненим типом даних. Це означає, що його можна використовувати для організації черги об'єктів будь-якого типу. У цьому прикладі створюються дві черги: для цілих чисел і значень з плинною крапкою, але можна використовувати дані і будь-якого іншого типу.

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

#include <vcl>

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

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

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

const int size=100;

// Створення узагальненого класу chergaClass.

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

qType qpMas[size];

int sloc, rloc;

public:

chergaClass() { sloc = rloc = 0;}

void putQp(qType izm);

qType getQp(); // Виведення з черги значення

};

// Занесення об'єкта в чергу.

template <class qType> void chergaClass<qType>::putQp(qType izm)

{

if(sloc==size){ cout << "Черга заповнена.\n"; return;}

sloc++;

qpMas[sloc] = izm;

}

// Вилучення об'єкта з черги.

template <class qType> qType chergaClass<qType>::getQp()

{

if(rloc == sloc){ cout << "Черга порожня.\n"; return 0;}

rloc++;

return qpMas[rloc];

}

int main()

{

// Створюємо дві черги для цілих чисел.

chergaClass<int> a_ob, b_ob;

a_ob.putQp(10);

b_ob.putQp(19);

a_ob.putQp(20);

b_ob.putQp(1);

cout << a_ob.getQp() << " ";

cout << a_ob.getQp() << " ";

cout << b_ob.getQp() << " ";

cout << b_ob.getQp() << "\n";

// Створюємо дві черги для double-значень

chergaClass<double> c_ob, d_ob;

c_ob.putQp(10.12);

d_ob.putQp(19.99);

c_ob.putQp(-20.0);

d_ob.putQp(0.986);

cout << c_ob.getQp() << " ";

cout << c_ob.getQp() << " ";

cout << d_ob.getQp() << " ";

cout << d_ob.getQp() << "\n";

getch(); return 0;

}

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

10 20 19 1

10.12 -20 19.99 0.986

У цій програмі оголошення узагальненого класу є подібним до оголошення узагальненої функції. Тип даних, що зберігаються в черзі, узагальнений в оголошенні класу. Він невідомий доти, доки не буде оголошений об'єкт класу chergaClass, який і визначить реальний тип даних. Після оголошення конкретного примірника класу chergaClass компілятор автоматично згенерує всі функції та змінні, необхідні для оброблення реальних даних. У цьому прикладі оголошуються два різних типи черги: дві черги для зберігання цілих чисел і дві черги для значень типу double. Зверніть особливу увагу на ці оголошення:

chergaClass<int> a_ob, b_ob;

chergaClass<double> c_ob, d_ob;

Зауважте, як вказується потрібний тип даних: він поміщається в кутові дужки. Змінюючи тип даних під час створення об'єктів класу chergaClass, можна змінити тип даних, що зберігаються в черзі. Наприклад, використовуючи таке оголошення, можна створити ще одну чергу, яка міститиме покажчики на символи:

chergaClass<char *> chrptrQ;

Можна також створювати черги для зберігання даних, тип яких створений програмістом. Наприклад, припустимо, Ви використовуєте таку структуру для зберігання інформації про адресу:

struct addrStruct { // Оголошення типу структури

char name[40];

char street[40];

char city[30];

char state[3];

char zip[12];

};

Тоді для того, щоб за допомогою класу chergaClass, можна було згенерувати чергу для зберігання об'єктів типу addrStruct, достатньо використовувати таке оголошення:

chergaClass<addrStruct> obj;

На прикладі класу chergaClass неважко переконатися, що узагальнені функції та класи є потужними засобами, які допоможуть збільшити ефективність роботи програміста, оскільки вони дають змогу визначити загальний формат об'єкта, який можна потім використовувати з будь-яким типом даних. Узагальнені функції та класи позбавляють Вас від рутинної праці зі створення окремих реалізацій для кожного типу даних, що підлягають обробленню єдиним алгоритмом. Цю роботу зробить за Вас компілятор: він автоматично створить конкретні версії визначеного Вами класу.