IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Проблема с ООП, поле класса - другой класс
klem4
сообщение 13.11.2007 19:10
Сообщение #1


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


вот есть такой пример:

класс 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";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 20.07.2025 3:53
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"