Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laby_po_OOP.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
2.23 Mб
Скачать

Задание для самостоятельного решения

Задание 2.

Создать полиморфный класс CFile, инкапсулирующий в себе такие функции работы с файлами как Open, Close, Seek, Read, Write, GetPosition и GetLenght. На базе этого класса создать производный класс CMyDataFile – файл, содержащий в себе данные некоторого определенного типа MyData, а также заголовок, облегчающий доступ к этому файлу.

Написать программу, демонстрирующую работу с этими классами.

Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.

Учреждение образования «Гомельский торгово-экономический колледж» Белкоопсоюза

Рассмотрено на заседании цикловой комиссии «Информатики и программирования»

Протокол № __ от «__»_____________2010 г.

Председатель цикловой комиссии

_______________________ Н.С. Васьковцова

Лабораторная работа №4

«Разработка программ с использованием динамических объектов»»

по дисциплине «Объектно-ориентированное программирование»

для групп П-21, П-22, П-23

специальность:

2-40 01 01 «Программное обеспечение информационных технологий»

специализация:

2-40 01 01 35 «Программное обеспечение обработки экономической и деловой информации»

2-40 01 01 33 «Компьютерная графика»

Разработала преподаватель

О.Л. Иткина

Гомель, 2010

Цель работы: научиться разрабатывать программы с использованием динамических объектов

Теоретические сведения:

Объекты в динамической памяти

Для хранения объектов в программах чаще всего используется динамическая па­мять, поскольку это обеспечивает гибкость программы и эффективное использование памяти. Благодаря расширенной совместимости типов можно описать указатель на базовый класс и хранить в нем ссылку на любой его объект-пото­мок, что в сочетании с виртуальными методами позволяет единообразно рабо­тать с различными классами иерархии. Из объектов или указателей на объекты создают различные динамические структуры.

Динамическое создание объектов

Для работы с динамическими объектами используется расширенный синтаксис процедур New и Dispose. Обе процедуры в этом случае содержат в качестве второ­го параметра имя конструктора или деструктора объекта:

New(P, Construct) или

Dispose(P, Destruct).

где Р — указатель на переменную объектного типа, a Construct и Destruct — конст­руктор и деструктор этого типа.

Действие процедуры New в случае расширенного синтаксиса равносильно дей­ствию операторов

New(P);

Р^.Construct;

а вызов процедуры Dispose эквивалентен последовательности

Р^.Destruct; Dispose(P);

Динамические объекты. Деструкторы

Для выделения памяти под объекты используются процедура и функция new.

На­пример, если определены указатели:

type

pmonstr = *monstr:

pdaemon = ^daemon; var pm : pmonstr; pd : pdaemon;

можно создать объекты с помощью вызовов:

new(pm); { или pm := new(pmonstr); } new(pd); { или pd := new(pdaemon); }

Обратите внимание, что при использовании new в форме процедуры параметром является указатель, а в функцию передается его тип. Так как после выделения памяти объект обычно инициализируют, в Паскале для удобства определены расширенные формы new с двумя параметрами. На месте второго параметра зада­ется вызов конструктора объекта:

new(pm, initd, 1, 1, 1);

{ или

pm := new(pmonstr, initCl. 1, 1, 1));

} '

new(pd, initd, 1, 1, 1, 1):

{или

pd := new(pdaemon. initd, 1, 1, 1, D);

}

Для освобождения памяти, занятой объектом, применяется процедура Dispose:

Dispose(pm); При выполнении этой процедуры освобождается количество байтов, равное раз­меру объекта, соответствующего типу указателя. Следовательно, если на самом деле в указателе хранится ссылка на объект производного класса, который, как известно, может быть больше своего предка, часть памяти не будет помечена как свободная, но доступ к ней будет невозможен, то есть появится мусор. Второй случай появления мусора возникает при применении процедуры Dispose к объекту, поля которого являются указателями.

Для корректного освобождения памяти из-под полиморфных объектов следует использовать вместе с процедурой Dispose специальный метод — деструктор. Ему рекомендуется давать имя done, например:

destructor monstr.done:

begin

end:

Для правильного освобождения памяти деструктор записывается вторым пара­метром процедуры Dispose:

Dispose(pm, done);

Это верно только для виртуальных методов.

Для простых объектов деструктор может быть пустым, а для объектов, содержа­щих динамические поля, в нем записываются операторы освобождения памяти для этих полей. В деструкторе можно описывать любые действия, необходимые для конкретного объекта, например закрытие файлов. Исполняемый код деструк­тора никогда не бывает пустым, потому что компилятор по служебному слову destructor вставляет в конец тела метода операторы получения размера объекта из VMT. Деструктор передает этот размер процедуре Dispose, и она освобождает количество памяти, соответствующее фактическому типу объекта. (Вызов деструктора вне процедуры Dispose память из-под объекта не освобождает)

Деструкторы рекомендуется делать виртуальными, чтобы при вызове всегда вы­полнялся деструктор, соответствующий типу объекта. Деструкторы обязательно использовать только для динамических полиморфных объектов, однако можно их применять и для статических объектов. В объекте можно определить несколько деструкторов (естественно, в этом случае они должны иметь разные имена).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]