Forward Declaration
-
Hey,
Um ein Kreuzinclude zu umgehen brauch ich eine Forward Declaration einer Klasse. in sämtlichen Beispielen blick ich net durch. Mein Compiler hat stets was zu nörgeln. Kann mir mal bitte jemand für folgende einfache Klasse eine Forward Declaration basteln?
// Hybrid.h #include "Red.h" class CHybrid: public CRed { CHybrid(); int i; double *p; void Run(double *a = NULL); };Thx.
-
An der Stelle brauchst du die komplette Definition von CRed, also kommst du hier um den #include nicht herum.
-
Ich weiß jetzt nicht ob das dein Problem ist, aber wenn du bei öfters eingebundenen Klassen Schwierigkeiten beim compilieren hast, helfen dir Präprozessoranweisungen wie #ifndef, #define und #endif.
-
OK, dann eben nochmal komplett, wollte es minimal halten:
// Hybrid.h #ifndef _HYBRID_H_ #define _HYBRID_H_ #include "Red.h" #include "Calc.h" class CHybrid: public CRed { CHybrid(); int i; double *p; void Run(double *a = NULL); CCalc cal; }; #endifGenau genommen geht es nicht um CRed sondern um CCalc. Aus cal will ich später mal über nen Pointer Run aufrufen (Callback mäßig). Dazu will ich in Calc.h die Klasse CRed bekannt machen. Daher die Forward Decl für CRed. Kann das mal bitte jemand posten? Thx.
-
Sorry jetz hab ich mich verschrieben. Ich will CHybrid bekannt machen, nicht CRed. Also Forward Decl für CHybrid.
-
In dieser Datei kannst du nach wie vor keine Forward-Deklarationen einsetzen, aber womöglich in der Calc.h:
class CRed;//da ist deine FD class CCalc { ... void Run(CRed* user); ... };
-
Genau das meine ich. Ich will aber CHybrid vordeklarieren. Is ja nun auch egal ob CRed oder CHybrid für CCalc vordefiniert wird. Er spingt danach ja wieder in die alten Header zurück, und wenn er dann zur eigentlichen Deklaration von CHybrid oder CRed kommt, dann meckert der Compiler rum dass ich die Klasse entweder schonmal definiert hab, oder dass er dann bei der Objekterstellung CCalc cal in CHybrid oder CRed nix mit CCalc anfangen kann.
Ich werd trotzdem erstmal weiter experimentieren. Evt hab ich andere Fehler eingebaut
Trotzdem erstmal danke soweit.
-
Eine Forward-Deklaration ersetzt auch nicht vollständig die Klassendefintion. Sobald du die Größe oder Struktur der Klasse benötigst, fällt die FD flach (d.h. in deinem Fall spätestens bei der Implementierung der CCalc-Methoden muß der Compiler die komplette Klasse kennen):
//Calc.h class CHybrid;//FD class CCalc { ... public: void run(CHybrid*);//hier reicht die FD ... }; //Calc.cpp #include "Calc.h" #include "Hybrid.h" void CCalc::run(Hybrid* owner) { owner.Run(...);//benötigt die komplette Definition ... }
-
Funktioniert bestens. Danke. Hatte ein Include zu viel
