Учебная работа. Доклад: Динамические объекты
Объектные переменные в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); {Удаление динамического объекта}
…….
По мере необходимости деструктор, как и хоть какой иной способ объекта
(не считая конструктора!), можно объявить виртуальным.
]]>