asyan.org
добавить свой файл
1

Мови ООП

Лабораторна робота №2




Тема: Конструктори і деструктори. Динамічні об'єкти.

Мета: вивчити застосування конструкторів і деструкторов.

Теоретичні відомості

Конструктори і деструктори. Динамічні об'єкти


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

У останньому прикладі з попереднього розділу таким конструктором є Create. Синтаксичний конструктор оформляється в точності як звичайний метод-процедура, із заміною службового слова procedure на службове слово constructor. Зміст введення конструкторів полягає в тому, що він крім дій, заданих у його тілі, формує в примірнику об'єкта необхідну інформацію для наступних викликів віртуальних методів об'єкта. У одному об'єктовому типі може бути будь-яке число конструкторів. Сам конструктор не може бути віртуальним.

Недотримання приведеного правила, хоча і не контролюється компілятором, але при виконанні може призвести до непередбаченого поводження програми.

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

var

CirclePtr : ^Circle;

begin

New (CirclePtr) ;

CirclePtr*. Create (100, 200,35) ;

Даний приклад показує, що засіб динамічного утворення примірників об'єктів нічим не відрізняється від породження значень будь-яких інших типів. Потрібно ще зауважити таке. Як вже говорилося, якщо об'єкт містить віртуальні методи, до його примірника повинний бути застосований відповідний конструктор (ця дія і показана в останньому операторі фрагмента). Таким чином, породження об'єкта і його ініціалізації конструктором є тими діями, що відбуваються послідовно. З метою більшої наочності Turbo Pascal припускає суміщення цих двох дій в однім виклику New: якщо першим параметром стандартної процедури New є покажчик на об'єктовий тип, то другим параметром процедури може бути виклик його конструктора, наприклад: New (CirclePtr, Create (100,200, 35) ) ;

Зверніть увагу, що виклик конструктора в останньому випадку не містить складового (крапкового) імені, тому що перший параметр New однозначно визначає, із якого об'єктового типу береться конструктор Create.

Звільнення динамічної пам'яті, виділеної об'єкту, реалізується стандартною процедурою Dispose, також аналогічно значенням інших типів: Dispose (PointPtr) ;

З процедурою звільнення пам'яті пов'язаний особливий вид методів, у деякому змісті симетричний методам-конструкторам. Ці методи називаються деструкторами і призначені для виконання яких-небудь дій завершального характеру. Деструктори оформляються так само, як звичайні методи-процедури, із заміною службового слова procedure на службове слово destructor. На відміну від методів-конструкторів, деструктори можуть бути віртуальними і можуть успадковуватися; в однім об'єктовому типі може бути визначено декілька деструкторов.

Використання деструкторов реально необхідно у випадку, коли примірник об'єкта був створений динамічно (процедурою New). Тоді завершення роботи з даним примірником рекомендується робити за допомогою розширеного виду процедури Dispose, другим параметром якої є виклик деструктора. Наприклад, якщо PointPtr - покажчик на примірник об'єктового типу Point, a Point .Done - деструктор цього типу, то можна сполучити операцію звільнення пам'яті і завершальні дії з примірником: Dispose (PointPtr, Done) ;

Зауважимо, що виклик деструктора як такого (поза процедурою Dispose) не призведе до звільнення пам'яті, що займається примірником об'єкта.

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

PointPtr CirclePtr

По правилах сумісності припустимо присвоювання виду:

PointPtr := CirclePtr;

Після такого присвоювання покажчик PointPtr містить посилання на область більшого розміру, ніж пам'ять, яку відводять для примірників типу Point. У даній ситуації застосування до покажчика PointPtr стандартної процедури Dispose із методом-деструктором у якості другого параметра гарантує коректне звільнення саме того обсягу пам'яті, що реально займає примірник по покажчику PointPtr.


Задача
Розробити класи 3-х типів об'єктів. Реалізувати для кожного з класів пару конструктор-деструктор та метод, що відображає “життєдіяльність” об’єкта. Ініціалізувати початковий стан об'єкта за допомогою конструктора. Об'єднати процес ініціалізації з виділенням місця в динамічній пам'яті. Показати процес “життєдіяльності” об’єкта на екрані в графічному режимі. Об'єднати процес деструкції з операцією звільнення динамічної пам’яті.

Написати програму, що:

  1. По запиту від користувача створює об'єкт одного з даних класів за допомогою конструктора об’єкта;

  2. Виводить початкові дані об’єкта перед початком функціонування;

  3. Запускає процес функціонування об’єкта з показом процесу на екрані в графічному режимі та паралельним моніторингом стану ( показом декількох властивостей класу у виділеній частині екрану);

  4. Термінує об’єкт по досягненню деякої умови з виведенням інформації про кінцевий стан об’єкта за допомогою деструктора об’єкта.


Хід роботи


  1. Ознайомитися з теоретичними відомостями.

  2. Одержати індивідуальне завдання.

  3. Написати програму, що цілком вирішує поставлену задачу.

  4. Показати результат викладачу.

  5. Одержати тестові дані для перевірки програми.

  6. Виконати перевірку програми з тестовими даними.

  7. Скласти і захистити звіт.


Склад звіту


  1. Титульний лист.

  2. Тема та ціль роботи.

  3. Стислі теоретичні відомості.

  4. Індивідуальне завдання.

  5. Опис роботи програми.

  6. Лістінг програми.

  7. Результати роботи програми.

  8. Висновки.




Стор.