Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с ООП, поле класса - другой класс
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
klem4
вот есть такой пример:

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

volvo
Цитата
почему-то у всех элементов в очереди класса obj_y: Y, значения элементов obj_x одинаковы
Это ты как определил? См. скриншот:

Нажмите для просмотра прикрепленного файла

Что именно указывает на одинаковость?
volvo
Randomize вынеси в основную часть программы... Не надо ей пользоваться в цикле.
klem4
не ждал я от туда подставы smile.gif)) спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.