Реферат: Динамические объекты

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

Объектныепеременные в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). При этом динамическая память можетоказаться исчерпанной. В этом случае стандартная функция обработки ошибокадминистратора кучи выдает значение 0, что вызывает аварийное завершениепрограммы с кодом ошибки 203. Если используется нестандартная функция обработкиошибок и эта функция возвращает 1, конструктор пропускает операторы после begin и возвращает NIL. Таким образом гарантируется, чтоисполняемые операторы конструктора будут работать только при условиинормального распределения динамической памяти. Однако в теле конструктора можетбыть создан новый динамический объект, в нем — свой и т.д. Турбо Паскаль

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

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

..........

type

TLine = object(Point)

......

Constructor Init;

Destructor Done;

end;

.......

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

.......

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

.......

При необходимости деструктор, как и любой другой метод объекта

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

еще рефераты
Еще работы по программированию, базе данных