Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Externe Deklaration von Klassen
FrEEzE2046 - Mi 16.12.09 16:08
Titel: Externe Deklaration von Klassen
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 - Mi 16.12.09 16:11
Am einfachsten den Parent als TObject deklarieren und dann im Implementationteil mit is und as explizit Typcasten.
FrEEzE2046 - 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 - 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 - 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 - Mi 16.12.09 16:40
Boldar hat folgendes geschrieben : |
mit is und as explizit Typcasten. |
FrEEzE2046 - 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 - 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 - Mi 16.12.09 16:46
Boldar hat folgendes geschrieben : |
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; | |
Ja, aber dass muss ich dann ja von außen machen und dass geht nicht. Es handelt sich um Klassen die ich anderen Entwicklern bereitstelle und nicht nur für den Eigengebrauch verwende. Da kann ich ja gleich nur Pointer übergeben, die dann gecastet werden müssen.
Kann ja ohne Hinweis niemand ahnen, dass man den Parent erst casten muss.
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!