Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Überkreuzende Benutzung 2r Klassen /Bidirektional Verbindung


Flamefire - Fr 26.09.08 15:34
Titel: Überkreuzende Benutzung 2r Klassen /Bidirektional Verbindung
Hallo,
ich habe folgendes Problem:

Erste Unit:

Delphi-Quelltext
1:
2:
3:
4:
5:
Unit unKlasse1;
type TKlasse1=class
private
  FKlasse2:TKlasse2;
...


Zweite Unit:

Delphi-Quelltext
1:
2:
3:
4:
5:
Unit unKlasse2;
type TKlasse2=class
private
  FKlasse1:TKlasse1;
...


Ich will also in jeder Klasse jeweils eine Referenz auf die andere Klasse Benutzen.
(Es handelt sich in meinem Fall um einen Thread, der Eigenschaften der Hauptklasse lesen soll. Diese Hauptklasse soll wiederum den Thread als referenz drin haben, um ihn z.B. Abzubrechen)
Wie kann ich das machen?
wenn ich die units gegenseitig in die Uses aufnehme kommt die Meldung "Überkreuzender Bezug 2er Units" logischerweise...
aber ich brauch ja die Unit in den uses weil er die TYpendeklaration sonst nicht kennt.

Gibts ne andere Möglichkeit, als die Typen alle in einer Unit zu deklarieren?


Boldar - Fr 26.09.08 15:54

versuch mal die unit hinter implementation zu machen und eine Forward-deklaration zu machen!


Flamefire - Fr 26.09.08 16:02

klappt leider nur bei prozeduren und funktionen

Edit: es geht nichtmal wenn ich sie untereinander schreibe. (Also erst Klasse1 und in er selben unit im gleichem type-Abschnitt Klasse2 definiere)
Es kommt dann "Unbekannter Bezeichner TKlasse2" und "Bezeichner redefiniert TKlasse2"


Delete - Fr 26.09.08 16:14

Ich fürchte, Du wirst beide Klassen in dieselbe Unit packen müssen und auch dann musst Du eine der beiden forward deklarieren, sonst geht es nicht.


footstep78 - Fr 26.09.08 16:36

Innerhalb einer Unit geht es schon, für eine Klasse braucht man aber eine Vorwärtsdeklaration. Die sieht bei Klassen aber anders aus, als bei Prozeduren und Funktionen (also nicht mit dem Schlüsselwort forward).

Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
TKlasse2=class;

TKlasse1=class
private  
  FKlasse2:TKlasse2; 
end;

TKlasse2=class  
private  
  FKlasse1:TKlasse1; 
end;


Delete - Fr 26.09.08 16:40

Genauso hatte ich das gemeint ;)


Flamefire - Sa 27.09.08 18:36

Danke das klappt =)