Я завершила экзамен 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 ] .