|
Я завершила экзамен 90 баллов на 5. Сертификат не заказала. Сейчас пытаюсь найти как его заказать. у меня указано экзамен пройден баллы оценка видно, а чтоб заказать сертификат нигде не видно. |
Иерархии объектов. Работа с объектами в динамической памяти
Контейнер для полиморфных объектов
Если объект предназначается для хранения других объектов, он называется контейнером. Объекты в контейнере могут храниться в виде массива, списка, стека или другой динамической структуры. Методы контейнера обычно включают его создание, дополнение, просмотр, а также поиск и удаление элементов.
В качестве примера контейнера рассмотрим объект list, предназначенный для работы со связным списком объектов класса monster и его потомков:
type list = object
constructor init;
procedure add(pm : pmonster);
procedure draw;
destructor done;
private
beg : pnode;
end;В объекте одно поле beg — указатель на начало списка элементов типа node:
type pnode = ^node;
node = record
pm : pmonster; { указатель на объект pmonster }
next : pnode; { указатель на следующий элемент списка }
end;Структура объекта list поясняется на рис. 7.5.
В программе ( пример 7.4) создается список из n объектов. Вследствие расширенной совместимости типов методу add может быль передан указатель на любой тип, производный от monster. Объекты выводятся на экран, при этом в одном и том же цикле вызываются разные виртуальные методы draw в соответствии с фактическим типом объекта. Затем динамическая память освобождается с помощью одного вызова деструктора.
program demo_list;
uses graph, crt, monsters;
const n = 30;
type pnode = ^node;
node = record
pm : pmonster;
next : pnode;
end;
list = object
constructor init;
procedure add(pm : pmonster);
procedure draw;
destructor done;
private
beg : pnode;
end;
constructor list.init; { --------------------------------------- list.init ---- }
begin beg := nil end;
procedure list.add(pm : pmonster); { --------------------------- list.add ----- }
var p : pnode;
begin
new(p);
p^.pm := pm;
p^.next := beg;
beg := p;
end;
procedure list.draw; { --------------------------------------- list.draw ---- }
var p : pnode;
begin
p := beg;
while p <> nil do begin
p^.pm^.draw;
p := p^.next;
end;
end;
destructor list.done; { --------------------------------------- list.done ---- }
var p : pnode;
begin
while beg <> nil do begin
p := beg;
dispose(p^.pm, done); { 1 }
beg := p^.next; { 2 }
dispose(p); { 3 }
end
end;
procedure report(message: string); { --------------------------- report ------- }
var s : string;
begin
str(MemAvail, s);
outtext(message + s);
moveto(0, GetY + 12);
end;
var stado : list;
x, y : integer;
gd, gm : integer;
p : pmonster;
i : word;
{ ---------------------------------- главная программа ------------------------ }
begin
gd := detect; initgraph(gd, gm, '...');
if graphresult <> grOk then begin
writeln('ошибка инициализации графики'); exit end;
randomize;
report(' доступно в начале программы: ');
stado.init;
for i := 1 to n do begin
case random(2) of
0 : p := new(pmonster, init(random(600), random(440), 10, 8));
1 : p := new(pdaemon, init(random(600), random(440), 10, 8, 6));
end;
stado.add(p); { добавление объекта в список }
end;
report(' доступно после выделения памяти: ');
stado.draw; { отрисовка объектов }
stado.done; { уничтожение объектов }
report(' доступно после освобождения памяти: ');
readln;
end.
Листинг
7.4.
Программа, работающая со списком полиморфных объектов
Подробные пояснения к этой программе приведены в учебнике [ 10 ] .
