Autor |
Beitrag |
Marco D.
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Mi 31.01.07 20:42
Christian beschreibt hier 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?
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: 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.
Zuletzt bearbeitet von Allesquarks am Mi 31.01.07 21:02, insgesamt 2-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 31.01.07 20:56
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? 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Marco D. 
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: 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 
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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; |
_________________ Markus Kinzler.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Marco D. 
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: 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.
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mi 31.01.07 21:13
Ja oder eine anderer (abstrakte) Superklasse.
_________________ Markus Kinzler.
|
|