вот есть такой пример:
класс X - очередь, каждый элемент очереди содержит помимо ссылки на следующий элемент еще поле value: Integer;
класс Y - очередь, каждый элемент очереди содержит помимо ссылки на следующий элемент еще поле value: String и поле obj_x: X;
так вот почему-то у всех элементов в очереди класса obj_y: Y, значения элементов obj_x одинаковы ... хотя заполняются разными значениями =(((
модуль
unit Unit1; interface type PA = ^TA; TA = record value: Integer; next: PA; end; X = class private first, last: PA; public constructor Create; destructor Free; function Empty: Boolean; procedure Push(const value: Integer); procedure Pop; property Top: PA read first; end; PB = ^TB; TB = record value: String; obj_x: X; next: PB; end; Y = class private first, last: PB; public constructor Create; destructor Free; function Empty: Boolean; procedure Push(const value: String); procedure Pop; property Top: PB read first; end; implementation constructor X.Create; begin first := nil; last := nil; end; destructor X.Free; begin while not Empty do Pop; end; procedure X.Push(const value: Integer); var T: PA; begin New(T); T^.value := value; T^.next := nil; if Empty then first := T else last^.next := T; last := T; end; procedure X.Pop; var T: PA; begin if not Empty then begin T := first; first := first^.next; dispose(T); end; end; function X.Empty: Boolean; begin result := first = nil; end; { Y } constructor Y.Create; begin first := nil; last := nil; end; destructor Y.Free; begin while not Empty do Pop; end; procedure Y.Push(const value: String); var T: PB; n, i: Integer; begin New(T); T^.value := value; T^.obj_x := X.Create; randomize; n := Random(10) + 1; for i := 1 to n do T^.obj_x.Push(random(10)); T^.next := nil; if Empty then first := T else last^.next := T; last := T; end; procedure Y.Pop; var T: PB; begin if not Empty then begin T := first; first := first^.next; T^.obj_x.Free; Dispose(T); end; end; function Y.Empty: Boolean; begin result := first = nil; end; end.
тестовый пример:
program Project2; {$APPTYPE CONSOLE} uses SysUtils, Unit1 in 'Unit1.pas'; var obj_y: Y; begin obj_y := Y.Create; obj_y.Push('a'); obj_y.Push('b'); obj_y.Push('c'); while not obj_y.Empty do begin writeln; write(obj_y.Top.value, ': '); while not obj_y.Top.obj_x.Empty do begin write(obj_y.Top.obj_x.Top.value, ', '); obj_y.Top.obj_x.Pop; end; obj_y.Pop; end; obj_y.Free; readln; end.
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'