Учебная работа. Доклад: Динамические объекты

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Контрольные рефераты

Учебная работа. Доклад: Динамические объекты

ДИНАМИЧЕСКИЕ ОБЪЕКТЫ

Объектные переменные вo многом подобны обыденным переменным Турбо Паскаля, а именно, их можно располагать в динамической памяти. Турбо Паскаль содержит средства, облегчающие размещение объектных переменных в куче и их удаление из нее, к примеру:

var

Pline: ^Tline;

…….

New(Pline, Init):

…….

В этом примере размещение объектной переменной (на нее показывает PLINE) в куче сопровождается одновременным воззванием к конструктору TLINE.INIT для инициализации объекта и связывания виртуальных способов с вновь сделанной переменной: в процедуре NEW допускается в качестве второго параметра указывать воззвание к конструктору.

Наиболее того, функцию NEW можно вызывать и как функцию — в этом случае она возвращает значение типа POINTER, указывающее на динамически распределенный объект:

PLine := New(TLine);

либо

PLine := New(TLine, Init):

Обратите внимание: первым параметром процедуре New передается указатель на динамически распределяемый объект, в то время как первым параметром функции NEW — тип распределяемого объекта. И в том, и в другом случае в качестве втором параметра воззвания допускается употреблять вызов конструктора, но имя конструктора не быть может составным -ведь в момент воззвания динамический объект еще не сотворен. к примеру, оператор

New(Pline, PLine^.Init);

вызовет сообщение о ошибке.

При воззвании к NEW с одновременным вызовом конструктора динамическая память резервируемая при помощи специального программного кода, входящего в хоть какой конструктор и вызываемого до начала работы исполняемой части конструктора (до begin). При всем этом динамическая память может оказаться исчерпанной. В этом случае обычная функция обработки ошибок админа кучи выдает работать лишь при условии обычного распределения динамической памяти. Но в теле конструктора быть может сотворен новейший динамический объект, в нем — собственный и т.д. Турбо Паскаль

допускает произвольную глубину вложенности конструкторов. Если на каком-то уровне обнаружится нехватка динамической памяти, нужно устранить всю цепочку удачно распределенных объектов. Чтоб эта операция стала вероятной, в Турбо Паскаль введена обычная процедура без характеристик FAIL, которая может вызываться лишь из конструктора и которая высвобождает уже выделенную конструктором память, завершает его работу и возвращает NIL.

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

……….

type

TLine = object(

……

Constructor Init;

Destructor Done;

end;

…….

New(PLine, Init); {Размещение динамического объекта}

…….

Dispose(PLine, Done); {Удаление динамического объекта}

…….

По мере необходимости деструктор, как и хоть какой иной способ объекта

(не считая конструктора!), можно объявить виртуальным.


]]>