Znikające wskaźniki na klasy.

0

Witam!
Piszę większy projekt w Delphi6, piszę na Win7x64. Podczas pracy natknąłem sie na problem ze wskaźnikami. Kod demonstrujący problem:

Klasy:

type
  Pouter = ^outer;

  outer = class;
  inner = class;
  middle = class;

  outer = class
   id:integer;
   mid:middle;
   constructor Create;
  end;

  middle = class
   count:integer;
   arr:array [0..100] of inner;
   constructor Create;
   procedure add(id:integer; parent:Pouter);
  end;

  inner = class
   id:integer;
   outt:Pouter;
   constructor Create(id:integer; outt:Pouter);
  end;

Metody:

constructor middle.Create;
begin
 self.count:=0;
end;

procedure middle.add(id:integer; parent:Pouter);
begin
 arr[self.count]:=inner.Create(id, parent);
 self.count:=self.count+1;
end;

constructor outer.Create;
var
i:integer;
begin
 self.id:=1970;
 self.mid:=middle.Create;
 for i:=0 to 10 do
 self.mid.add(i,@self);
end;

constructor inner.Create(id:integer; outt:Pouter);
begin
 self.id:=id;
 self.outt:=outt;
end;

Użycie

procedure TForm1.Button1Click(Sender: TObject);
var
  ou:outer;
begin
 ou:=outer.Create;
 ShowMessage(IntToStr(ou.id)+' '+IntToStr(ou.mid.arr[4].outt.id));
end;

Opis:
Klasa outer - klasa zewnętrzna, zawiera obiekt klasy middle
Klasa middle - zawieta tablicę statyczną obiektów klasy inner
Klasa inner - zawiera id i wskaźnik na obiekt klasy outer do którego pośrednio (przez klasę middle) przynależy

Problem: wskaźnik na obiekt klasy outer jest przekazywany przez konstruktor klasy middle do konstruktora klasy inner, jednak z jakiegoś powodu nie jest tam przypisywany. Kod podany jako "użycie" wywala Access Violation. Wyeliminowanie klasy middle probem rozwiazuje, wskaźnik trafia tam gdzie powinien i bez problemu się da do niego odwołać. Czemu wstawiając jedną klasę na drodze wskaźnika wszystko się rozsypuje?

0

tworzenie zmiennej typu a:TKlasa jest sama w sobie referencją, referencja do referencji jest dosyć problematyczna, więc najlepiej zastosuj TKlasa nie PKlasa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0