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

20.1.2. Приклад rtti-застосування

У наведеному нижче коді програми показано, наскільки корисним може бути засіб динамічної ідентифікації типів (RTTI). Тут використовується модифікована версія ієрархії класів геометричних фігур з розд. 16, який обчислює площу круга, трикутника і прямокутника. У наведеному нижче коді програми визначена функція factory(), призначена для створення примірника круга, трикутника або прямокутника. Ця функція повертає покажчик на створений об'єкт1. Конкретний тип створюваного об'єкта визначається в результаті звернення до функції rand() С++-генератора випадкових чисел. Таким чином, ми не можемо знати наперед, об'єкт якого типу буде згенеровано. Програма створює десять об'єктів і підраховує кількість створених фігур кожного типу. Оскільки під час виклику функції factory() може бути згенерована фігура будь-якого типу, то для визначення типу реально створеного об'єкта у програмі використовують оператор typeid.

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

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

#include <cstdlib> // Для використання бібліотечних функцій

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

class figUre {

protected:

double x, y;

public:

figUre(double izm, double jzm) { x = izm; y = jzm;}

virtual double area() = 0;

};

class triAngle: public figUre {

public:

triAngle(double izm, double jzm): figUre(izm, jzm) {}

double area() { return x * 0.5 * y;}

};

class rectAngle: public figUre {

public:

rectAngle(double izm, double jzm): figUre(izm, jzm) {}

double area() { return x * y;}

};

class cirCle: public figUre {

public:

cirCle(double izm, double jzm=0): figUre(izm, jzm) {}

double area() { return 3.14 * x * x;}

};

// Генератор об'єктів класу figUre.

figUre *factory() {

switch(rand() % 3) {

case 0: return new cirCle(10.0);

case 1: return new triAngle(10.1, 5.3);

case 2: return new rectAngle(4.3, 5.7);

}

return 0;

}

int main()

{

figUre *p; // Покажчик на базовий клас

int i;

int t = 0, r = 0, c = 0;

// Генеруємо і підраховуємо об'єкти

for(i=0; i<10; i++) {

p = factory(); // Генеруємо об'єкт

cout << "Об'єкт має тип " << typeid(*p).name();

cout << ". ";

// Враховуємо цей об'єкт

if(typeid(*p) == typeid(triAngle)) t++;

if(typeid(*p) == typeid(rectAngle)) r++;

if(typeid(*p) == typeid(cirCle)) c++;

// Відображаємо площу фігури

cout << "Площа дорівнює " << p->area() << endl;

}

cout << endl;

cout << "Згенеровано такі об'єкти:\n";

cout << " трикутників: " << t << endl;

cout << " прямокутників: " << r << endl;

cout << " кругів: " << c << endl;

getch(); return 0;

}

Можливий результат виконання цієї програми такий:

Об'єкт має тип class rectAngle. Площа дорівнює 24.51

Об'єкт має тип class rectAngle. Площа дорівнює 24.51

Об'єкт має тип class triAngle. Площа дорівнює 26.765

Об'єкт має тип class triAngle. Площа дорівнює 26.765

Об'єкт має тип class rectAngle. Площа дорівнює 24.51

Об'єкт має тип class triAngle. Площа дорівнює 26.765

Об'єкт має тип class cirCle. Площа дорівнює 314

Об'єкт має тип class cirCle. Площа дорівнює 314

Об'єкт має тип class triAngle. Площа дорівнює 26.765

Об'єкт має тип class rectAngle. Площа дорівнює 24.51

Згенеровано такі об'єкти:

трикутників: 4

прямокутників: 4

кругів: 2