Klassen und Header
-
Hallo zusammen,
wie bekomme ich sowas Kompiliert oder geht das gar nicht?
Ich hab mal versucht die relevanten Daten aus einem Code heraus zu kopieren:
// filename TCleanBasis.h class PACKAGE TCleanBasis : public TComponent { private: TDebug *IVDebug; [...] __published: __property TDebug *Debug = {read=IVDebug,write=Set_Debug}; [...] }; // filename TDebug.h class PACKAGE TDebug : public TCleanBasis { [...] };
Je nach dem welche Header ich zuerst Compiliere Meckert de Compiler das entweder die TDebug fehlt oder TCleanBasis.
-
Stichwort: forward reference (Vorwärtsreferenz)
-
Danke,
das hatte ich mir eigenlich auch gedacht, der Builder schmeißt mir dann aber die Fehlermeldung:[BCC32 Fehler] TDebug.h(13): E2029 'TCleanBasis' muss eine bereits definierte Klasse oder Struktur sein
Vollständiger Parser-Kontext
TDebug.cpp(5): #include TDebug.h
TDebug.h(12): class TDebug// filename TCleanBasis.h class PACKAGE TCleanBasis : public TComponent { private: TDebug *IVDebug; [...] __published: __property TDebug *Debug = {read=IVDebug,write=Set_Debug}; [...] }; // filename TDebug.h class TCleanBasis; class PACKAGE TDebug : public TCleanBasis { [...] };
-
Wenn ich das übrigens änders herum mache kann der bei Property den Typen nicht erkennen.
[BCC32 Fehler] TCleanBasis.h(40): E2109 Kein zulässiger Typ
// filename TCleanBasis.h class TDebug: class PACKAGE TCleanBasis : public TComponent { private: TDebug *IVDebug; // <-OK [...] __published: __property TDebug *Debug = {read=IVDebug,write=Set_Debug}; // <-- NOK [...] }; // filename TDebug.h class PACKAGE TDebug : public TCleanBasis { [...] };
-
JBOpael schrieb:
Danke,
// filename TDebug.h class TCleanBasis; class PACKAGE TDebug : public TCleanBasis { [...] };
Das hier kann nicht funktionieren, da bei Ableitungen der Typ der Basisklasse vollständig bekannt sein muss.
Bei deiner zweiten Variante sollte es eigentlich gehen. Es könnte natürlich sein, dass dir die Property hier einen Strich durch die Rechnung macht. Muss es unbedingt eine Property sein? Gehen hier nicht vielleicht normale Funktionen?
Ich finde das ganze Konzept aber etwas merkwürdig. Wieso soll eine Basisklasse in einer Funktion einen Zeiger auf eine abgeleitete Klasse zurückgeben. Normalerweise sollten Basisklassen nichts von den abgeleiteten Klassen wissen können. Reicht hier nicht ein Zeiger auf TCleanBasis?
__published: __property TCleanBasis *Debug = {read=IVDebug,write=Set_Debug};
-
Property hab ich verwendet weil die Klassen alle als Package kompiliert werden und ich gerne zur Designzeit jeder Komponente die von TCleanBasis abgeleitet ist die Komponente TDebug zuweisen möchte.
In TCleanBasis sind bei mir auch Funktionen enthalten die ein einfaches Serialisieren von Variabeln ermöglicht. Bisher hatte ich in TDebug nichts zu Serialisieren. Nunja bis jetzt... und da kam mir die Idee TDebug auch von TCleanBasis abzuleiten um diese Funktionen zu nutzen.
ich hab bei Google ein Code Schnipsel gefunden wo das in Delphi so umgesetzt ist. Naja, anscheinend funktioniert property in c++ mal wieder anders...
TBar = class; // Deklariere TFoo (verwendet TBar) TFoo = class private FBar: TBar; public property Bar: TBar read FBar; end; // Deklariere TBar (verwendet TFoo) TBar = class private FFoo: TFoo; public property Foo: TFoo read FFoo; end;
-
Hallo,
Man sollte niemals ableiten um Funktionen wiederverwenden zu können. Ableiten (public) sollte immer eine "Ist-Ein"-Beziehung ausdrücken. Ist das hier der Fall? Also ist ein TDebug auch ein TCleanBasis?
Wenn TDebug was zu serialisieren hat dann implementiere das doch auch dort. Bei deinem derzeitigen Design hast du doch vollen Zugriff auf alle Funktionen von TCleanBasis. Es ist hier schlicht nicht nötig dass TCleanBasis etwas von TDebug weiß.