Autor Beitrag
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 31.01.07 20:56 
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? ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Marco D. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Mi 31.01.07 21:08 
Hm hab deine Frage zuerst nicht zuende gelesen. Ich würde sagen etwa so:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mi 31.01.07 21:09 
Zur welchen Klasse gehört der Konstruktor?
Normalerweise funktionier forwardimg so:

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mi 31.01.07 21:13 
Zitat:
Das ginge doch?
Ja oder eine anderer (abstrakte) Superklasse.

_________________
Markus Kinzler.