Опубликован: 03.09.2010 | Доступ: свободный | Студентов: 3417 / 749 | Оценка: 4.11 / 3.69 | Длительность: 10:38:00
Лекция 7:

Иерархии объектов. Работа с объектами в динамической памяти

< Лекция 6 || Лекция 7: 12345

Контейнер для полиморфных объектов

Если объект предназначается для хранения других объектов, он называется контейнером. Объекты в контейнере могут храниться в виде массива, списка, стека или другой динамической структуры. Методы контейнера обычно включают его создание, дополнение, просмотр, а также поиск и удаление элементов.

В качестве примера контейнера рассмотрим объект 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.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 ] .

< Лекция 6 || Лекция 7: 12345
София Шишова
София Шишова

Я завершила экзамен 90 баллов на 5. Сертификат не заказала. Сейчас пытаюсь найти как его заказать. у меня указано экзамен пройден баллы оценка видно, а чтоб заказать сертификат нигде не видно.