класс 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.