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
Marco 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
Ja oder eine anderer (abstrakte) Superklasse.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!