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?