Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - 2 Klassen die durch ein Objekt auf sich gegenseitig verweisn


Basti1991 - Do 29.04.10 15:36
Titel: 2 Klassen die durch ein Objekt auf sich gegenseitig verweisn
Hallo liebe Community,

ich habe folgendes Problem. Ich habe 2 Klassen, die ich nacheinander definiert habe. Jetzt hat Klasse 1 ein Objekt, dass auf Klasse 2 verweist und umgekehrt. Jetzt bekomme ich den Fehler, dass (das kommt bei Klasse 1) Klasse 2 undefiniert sei (weil ich sie ja erst dannach definieren kann). Auch die Reihenfolge zu ändern würde ja nichts bringen, da Klasse 2 ja ein Objekt der Klasse 1 besitzt...wie kann man das lösen?

Hier mal mein Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
 TZustandAktion = class
    Lesen: TColor;
    Schreiben: TColor;
    Bewegen: TRichtung;
    NeuerZustand: TZustand; //<-- Undefinierter Bezeichner TZustand
  end;

  TZustand = class
     FId: Integer;
     Aktionen: Array of TZustandAktion; // wenn ich TZustand vor TZustandAktion definiere taucht logischerweise das Problem dann hier auf ;)
     public
        property Id: Integer read FId;
        procedure AktionHinzufuegen(Lesen, Schreiben: TColor; Bewegen: TRichtung; NeuerZustand: TZustand);
  end;


Hab bislang leider nichts gefunden dazu :/
Vileicht hab icha uch falsch gesucht, ich habs mit stichwörtern wie Zirkelbezug probiert, wobei ich da großteils auf Excel Probleme bestoßen bin :D

Vielen Dank schonmal und viele Grüße,
Sebastian


SvenAbeln - Do 29.04.10 16:03

Füge mal diese Zeile ein, dann geht es.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
 TZustand = class;

 TZustandAktion = class
    Lesen: TColor;
    Schreiben: TColor;
    Bewegen: TRichtung;
    NeuerZustand: TZustand; //<-- Undefinierter Bezeichner TZustand
  end;

  TZustand = class
     FId: Integer;
     Aktionen: Array of TZustandAktion; // wenn ich TZustand vor TZustandAktion definiere taucht logischerweise das Problem dann hier auf ;)
     public
        property Id: Integer read FId;
        procedure AktionHinzufuegen(Lesen, Schreiben: TColor; Bewegen: TRichtung; NeuerZustand: TZustand);
  end;


guinnes - Do 29.04.10 16:04

Erkläre dem Kompiler, was er noch nicht wissen kann :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  TZustand = class;

 TZustandAktion = class
    Lesen: TColor;
    Schreiben: TColor;
    Bewegen: TRichtung;
    NeuerZustand: TZustand; //<-- Undefinierter Bezeichner TZustand
  end;

  TZustand = class
     FId: Integer;
     Aktionen: Array of TZustandAktion; // wenn ich TZustand vor TZustandAktion definiere taucht logischerweise das Problem dann hier auf ;)
     public
        property Id: Integer read FId;
        procedure AktionHinzufuegen(Lesen, Schreiben: TColor; Bewegen: TRichtung; NeuerZustand: TZustand);
  end;


Narses - Do 29.04.10 16:04

Moin und :welcome: im Forum!

user profile iconBasti1991 hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt hat Klasse 1 ein Objekt, dass auf Klasse 2 verweist und umgekehrt.
[...]
wie kann man das lösen?
[...]
Vileicht hab icha uch falsch gesucht, ich habs mit stichwörtern wie Zirkelbezug probiert, wobei ich da großteils auf Excel Probleme bestoßen bin :D
Such mal nach Suche in: Delphi-Forum, Delphi-Library FORWARD DEKLARATION, damit solltest du weiter kommen. :lupe: :les: :think: ;)

cu
Narses

//EDIT: OK, zu langsam... :( ;)


Xion - Do 29.04.10 16:05

Eben mal in der Suche (F1) gestöbert.

Da steht:
F1 hat folgendes geschrieben:
Mit einer forward-Deklaration kann der Gültigkeitsbereich eines Prozedur- oder Funktionsbezeichners auf einen früheren Punkt im Quelltext ausgedehnt werden. Andere Prozeduren und Funktionen können also die mit forward deklarierte Routine aufrufen, bevor sie tatsächlich definiert wurde. forward-Deklarationen bieten also nicht nur mehr Flexibilität bei der Programmierung, sie werden auch gelegentlich für Rekursionen benötigt.


Ob das auch mit Typen geht...gute Frage


Basti1991 - Do 29.04.10 16:21

Vielen, vielen Dank an alle =)
Hat wunderbar geklappt :)