Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Forwarding von Klassen klappt nicht


Marco D. - Mi 31.01.07 20:42
Titel: Forwarding von Klassen klappt nicht
Christian beschreibt hier [http://www.christian-stelzmann.de/artikel/crashkurs.htm#forwarding] das Forwarding von Klassen. Ist ja auch schön und gut. Jedoch klappt das bei mir nicht, wenn die zu forwardende Klasse in einer anderen Unit definiert ist. Es ist auch absolut nicht machbar, diese Klassen in eine Unit zu packen, da es dann nicht nur diese beiden Klassen, sondern in letzer Konsequenz auch die anderen Klassen irgendwo betreffen würde. ;)
Das Problem liegt in Attributelist.pas:

Delphi-Quelltext
1:
2:
 TObjectclass = class;
 constructor Create(AObjectclass: TObjectclass);

Fehler: [Fehler] AttributeList.pas(19): Typ 'TObjectclass' ist nicht vollständig definiert
Was tun?


Allesquarks - Mi 31.01.07 20:48

Hm vergiss einfach was ich gesagt habe

Hm du könntest einen Pointer nehmen und dann im Code auf den Type casten. Das dürfte erlaubt sein bei der Implementation des Construktors, da nach implementation ein uses-Rückbezug auf die Unit erlaubt ist. Damit ist die Typsicherheit weg und wahrscheinlich musste dann auch jedesmal beim aufrufen des Konstruktors casten aber zumindest sollte es so gehen.


Christian S. - Mi 31.01.07 20:56
Titel: Re: Forwarding von Klassen klappt nicht
user profile iconMarco D. hat folgendes geschrieben:
Jedoch klappt das bei mir nicht, wenn die zu forwardende Klasse in einer anderen Unit definiert ist.
Aus der Delphi Referenz:
Zitat:
Eine Vorwärtsdeklaration muss durch eine definierende Deklaration dieser Klasse [highlight]im selben
Typdeklarationsabschnitt[/highlight] aufgelöst werden. Zwischen einer Vorwärtsdeklaration und der zugehörigen definierenden
Deklaration dürfen also mit Ausnahme anderer Typdeklarationen keine weiteren Anweisungen stehen. Das
bedeutet, dass zwischen einer Vorwärtsdeklaration und ihrer definierenden Deklaration ausschließlich andere
Typdeklarationen stehen dürfen.


//edit: Ist es nicht herrlich, mit einem so strunzdummen Compiler wie dem von Delphi zu arbeiten? ;-)


Marco D. - Mi 31.01.07 21:03

Ähm, nehmt es mir bitte nicht übel, aber wie löse ich denn die Deklaration der Klasse im selben Typdeklarationsabschnitt auf? Kann das jetzt nicht in Code umsetzen :?:


Allesquarks - Mi 31.01.07 21:08

Hm hab deine Frage zuerst nicht zuende gelesen. Ich würde sagen etwa so:

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

type myclass = class;

constructor create(aobjectclassmember:Pointer);

end;

implementation

uses unit2;

constructor myclass.create(aobjectclassmember:pointer);
var myeigentlichvar:TObjectclass;
begin
myeigentlichvar:=TObjectclass(aobjectclassmember);
end;


mkinzler - Mi 31.01.07 21:09

Zur welchen Klasse gehört der Konstruktor?
Normalerweise funktionier forwardimg so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
   Tklasse1 = class;
   Tklasse2 = class
       ...
       klasse1: Tklasse1;
      ...
   end;

   Tklasse1 = class
      ...
      Klasse2: Tklasse2;
   end;


Christian S. - Mi 31.01.07 21:11

@mkinzler: Er will das forwarding aber über zwei Units strecken. Das geht IMHO nicht, auf Grund des von mir zitierten Abschnitts aus der Delphi Referenz

@Marco: Das bekommst so hin, wie im Crashkurs oder von mkinzler beschrieben. Aber - ich sagte es schon - nicht über zwei Units verteilt.


Marco D. - Mi 31.01.07 21:12

Fällt mir jetzt ein:
Könnte ich nicht auch dem Konstruktor ein TObject übergeben und dann ObjectClass unter implementation schreiben. Im Konstruktor mache ich dann einen Typecast auf TObjectclass. Das ginge doch?
@mkinzler: Schon klar! Aber beide Klassen stehen nicht in einer Unit.


mkinzler - Mi 31.01.07 21:13

Zitat:
Das ginge doch?
Ja oder eine anderer (abstrakte) Superklasse.