Autor |
Beitrag |
FrEEzE2046
      
Beiträge: 109
Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
|
Verfasst: Mi 16.12.09 16:08
Hallo,
ich habe ein (in Delphi) aufwändiges Problem. Und zwar:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| uses Unit2;
TKlasseA = class(TObject) KlasseB : TKlasse B; end;
TKlasseB = class(TObject) Parent : PKlasseA; end; |
So, wie man sieht brauche ich in Klasse B einen Pointer auf seinen Parent. Es ist keine Option (für mich) beides in eine Unit zu packen. Da hat man natürlich die Möglichkeit, sowas per Forward-Deklaration zu lösen.
Wenn ich Unit1 in Unit2 im Interface einbinde, dann hab ich natürlich eine Überkreuzung drin. Ich muss doch irgendwie eine Extern-Deklaration machen können, um dem Compiler zu sagen, dass da etwas existiert, was später noch dem Linker mitgeteilt wird.
Besteht evtl die Möglichkeit den Code nur zu kompilieren und später zu linken?
Ich hoffe ihr könnt mir weiterhelfen.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Mi 16.12.09 16:11
Am einfachsten den Parent als TObject deklarieren und dann im Implementationteil mit is und as explizit Typcasten.
|
|
FrEEzE2046 
      
Beiträge: 109
Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
|
Verfasst: Mi 16.12.09 16:25
Boldar hat folgendes geschrieben : | Am einfachsten den Parent als TObject deklarieren und dann im Implementationteil mit is und as explizit Typcasten. |
Ich brauch den Parent aber nur in KlasseA. Also:
KlasseA.KlasseB.Parent (wieder KlasseA). D.h. nach Außen muss klar sein, welcher Typ es ist und darf nicht TObject sein.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Mi 16.12.09 16:36
FrEEzE2046 hat folgendes geschrieben : | nach Außen muss klar sein, welcher Typ es ist und darf nicht TObject sein. |
Wofür? Den Typ kannst du doch dann mit is feststellen ?!?
Oder mach aus Parent ne property, wo im setter geprüft wird, ob das auch wirklich der Richtige Typ ist.
|
|
FrEEzE2046 
      
Beiträge: 109
Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
|
Verfasst: Mi 16.12.09 16:38
Also, ich will den Zeiger auf KlasseA IN KlasseB gar nicht verwenden. Ich möchte viel mehr von einer Instanz von KlasseB aus, auf Methoden von KlasseA zugreifen können. Das geht nicht, wenn es für mich ein TObject ist.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Mi 16.12.09 16:40
Boldar hat folgendes geschrieben : | mit is und as explizit Typcasten. |
|
|
FrEEzE2046 
      
Beiträge: 109
Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
|
Verfasst: Mi 16.12.09 16:41
Boldar hat folgendes geschrieben : | Boldar hat folgendes geschrieben : | mit is und as explizit Typcasten. |
|
Kannst du mal ein Beispiel schreiben, ich versteh absolut nicht wie du dass meinst.
Bei mir besteht folgendes:
AArr : array of KlasseA;
BArr : ^array of KlasseB;
BArr zeigt auf alle KlasseB's in dem KlasseA Array. Ich will von BArr aber auch die Möglichkeit haben wieder zurück zu KlasseA zu kommen.
Außerdem scheitert es bei mir gerade dann, wie ich in KlasseA dem Konstruktor von KlasseB überhaupt die Adresse der aktuellen Instanz (von KlasseA) übergeben kann, da es in Delphi ja kein "this" gibt.
Da jedoch selbst Delphi die Speicheradresse der aktuellen Instanz braucht, fragt sich wie die Aufrufkonvention für Klassenmethoden in Delphi ist; dazu finde ich im Internet absolut gar nichts.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Mi 16.12.09 16:44
Deklarier halt einfach Parent als TObject. Wenn du es dann als TKlasseA (die Zeiger sind unnötig, Objecte sind in Delphi sowieso schon Zeiger) brauchst, nimmst du halt
Delphi-Quelltext 1:
| (xxx.Parent as TKlasseA).irgendetwas; |
Übrigens: In Delphi gibt es self statt this.
|
|
FrEEzE2046 
      
Beiträge: 109
Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
|
Verfasst: Mi 16.12.09 16:46
|
|