Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Деструктор –это так же, как и конструктор, специальный вид метода, который по-другому еще называют «сборщиком мусора».
Деструкторы объявляются с использованием ключевого слова destructor вместо слова procedure и предназначены для удаления динамически размещенных объектов и освобождения занимаемой ими памяти. Как правило, деструктор объединяет все действия по очистке памяти так, что бы очистку можно было выполнить за один вызов деструктора. Для каждого объектного типа, при необходимости, может быть создано несколько деструкторов, которые выполняют очистку памяти различными способами.
Аналогично конструкторам, для которых в каждом типе рекомендуется использовать одинаковый идентификатор Init, для всех деструкторов рекомендуется использовать имя Done. Деструкторы могут быть как статистическими, так и виртуальными, и их разрешается наследовать. Поскольку для различных типов объектов чаще всего требуются различные методы освобождения памяти, то рекомендуется всегда объявлять деструкторы виртуальными, благодаря чему, для каждого типа объекта будет выполнен правильный деструктор.
Пример деструктора
Destructor Done;
begin
CloseGraph;
end;
Для освобождения динамической памяти можно использовать процедуру Freemem.
FREEMEM(P,SIZE);
Здесь, P – нетипизированный указатель, SIZE –размер в байтах освобождаемой части кучи.
Использование процедур GETMEM-FREEMEM, как и вся работа с динамической памятью, требует особой осторожности и тщательного соблюдения простого правила: освобождать нужно ровно столько памяти, сколько ее было зарезервировано, и именно с того адреса, с которого она была зарезервирована.
Рассмотрим наследование, работу конструктора и деструктора на примере, приведенном выше.
Program DemoObgectStaya;
Uses Graph,CRT;
Type
Mother = object;
k,x,y,xa,ya,bx,by,ax,ay:integer;
vver,pole,vnis:Pointer;
Mize,Size,Lize,ax1,ay1:integer;
ch:char;
Constructor init;
Procedure Draw;
Procedure Mahi; Virtual;
Procedure Polet; Virtual;
Destructor Done;
end;
Doter = object(Mother)
Constructor initD;
Procedure DrawMin;
end;
Constructor Mother init;
begin
xa;=100;
ya:=100;
bx:=ax;
by:=ay;
ax1:=ax;
ax1:=ax;
end;
Constructor Doter.initD;
begin
k:=3;
xa;=100;
ya:=100;
ax:=ax1;
ay:=ay1;
bx:=ax;
by:=ay;
end;
Destructor Mother.Done;
begin
FreeMem(Vver,Size);
FreeMem(Vniz,Lize);
end;
Procedure Mother.Draw;
begin
Mother.init;
SetColor(14);
SetFillStyle(1,14);
FillEllipse(xa,ya,10,10);
Line(xa-10,ya,xa-30,ya);
Line(xa+10,ya,xa+30,ya);
Line(xa-30,ya,xa-50,ya-20);
Line(xa+30,ya,xa+50,ya-20);
Size:=ImageSize(xa-50,ya-20,xa+50,ya+20);
GetMem(vver,size);
GetImage(xa-50,ya-20,xa+50,ya+20,vver^);
ClearDevice
FillEllipse(xa,ya,10,10);
Line(xa-10,ya,xa-30,ya);
Line(xa-10,ya,xa+30,ya);
Line(xa-30,ya,xa-50,ya+20);
Line(xa+30,ya,xa+50,ya+20);
Lize:=ImageSize(xa-50,ya-20,xa+50,ya+20);
GetMem(vniz,lize);
GetImage(xa-50,ya-20,xa+50,ya+20,vniz^);
ClearDevice:
end;
Procedure Mother.Mahi(bx,by:integer);
begin
Mize:=ImageSize(bx,by,bx+100,by+40);
GetMem(pole,mize);
GetImage(bx,by,bx+100,by+40,pole^);
PutImage(bx,by,vver^,1);
delay(70);
PutImage(bx,by,pole^,0);
end;
Procedure Mother.Polet(ax,ay:integer);
Begin
ax:=ax1;
ay:=ay1;
repeat
if KeyPressed then
begin
ch:=ReadKey;
case ch of
#77:ax:=ax+10;
#75:ax:=ax-10;
#80:ay:=ay+10;
#72:ay:=ay-10;
end;
Mother.init;
Mahi;
end;
else
begin
Mother.init;
Mahi;
end;
until ch=#32;
Mother.init;
ax1:=ax;
ay1:=ay;
end;
Procedure Doter.DrawMin;
begin
SetColor(14);
SetFillStyle(1,14);
FillEllipse(xa,ya,round(10/k),round(10/k));
Line(xa- round(10/k),ya,xa- round(30/k),ya);
Line(xa+ round(10/k),ya,xa+ round(30/k),ya);
Line(xa- round(30/k),ya,xa- round(50/k),ya- round(20/k));
Line(xa+round(30/k),ya,xa+round(50/k),ya- round(20/k));
Size:=ImageSize(xa-round(50/k),ya-round(20/k),xa+round (50/k),ya+round(20/k));
GetMem(vver,size);
GetImage(xa-round(50/k),ya-round(20/k),xa+round(50/k), ya+ round(20/k),vver^);
ClearDevice
FillEllipse(xa,ya, round(10/k), round(10/k));
Line(xa- round(10/k),ya,xa- round(30/k),ya);
Line(xa- round(10/k),ya,xa+ round(30/k),ya);
Line(xa-round(30/k),ya,xa-round(50/k),ya+round(20/k));
Line(xa+round(30/k),ya,xa+round(50/k),ya+round(20/k));
Lize:=ImageSize(xa-round(50/k),ya-round(20/k),xa+ round (50/k),ya+ round(20/k));
GetMem(vniz,lize);
GetImage(xa-round(50/k),ya-round(20/k),xa+round(50/k), ya+ round(20/k),vniz^);
ClearDevice:
end;
Var GrDriver, GrMode,alx,aly:integer;
gol:mother;vorob:Doter;
Begin
GrDriver:=Detect;
InitGraph(GrDriver, GrMode, 'C: |Bp|BGI');
readln;
Gol.init;
Gol.Draw;
Gol.Polet;
Gol.Done;
Vorob.initD;
vorob.drawmin;
Vorob.initD;
vorob.Polet;
vorob.Done;
CloseGraph;
End.
Дата публикования: 2015-06-12; Прочитано: 322 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!