1>c:\Path\Project\SpecialDevice.h(116) : error C2143: syntax error : missing ';' before '*'
1>c:\Path\Project\SpecialDevice.h(116) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\Path\Project\SpecialDevice.h(116) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Wenn ich den obigen Zeiger nicht im Header, sondern zB in einer Methode im SpecialDevice.cpp deklariere und definiere:
Auch wenn ich mir natürlich nicht sicher sein kann, weil dafür, wie Christian81 ja schon geschrieben hat, die relevanten Informationen fehlen, sieht das nach einem rekursiven Include aus, also zwei Header, die sich gegenseitig includieren. Dann bekommt man vom cl (aus den Ausgaben schließe ich mal, dass Du im Visual Studio arbeitest) genau diesen Fehler.
Tipp: in SpecialDevice.h ist das #include "SpecialModule.h" unnötig. Eine forward declaration reicht völlig.
Anbei 4 Sourcen und 3 Header. Habe alles weggekürzt. Minimalkompilierbar ist es allerdings nicht, da mein Fehler ja noch da ist.
Es sind Sourcen für ein Qt-VS-Projekt.
@brax: Ja das könnte es sein. Ich check es mal gleich..
Durch die Vorwärtdeklaration sagst Du dem quasi Compiler nur, dass es eine Klasse mit dem Namen gibt. Da im Header nur ein Pointer auf ein Objekt dieser Klasse benutzt wird, braucht der Compiler auch gar nicht mehr darüber zu wissen. Erst wenn das Objekt, auf den der Pointer zeigt, wirklich benutzt wird, wird die eigentliche Definition gebraucht, daher muss dann natürlich das include in die cpp.
Ein include ist nichts anderes als eine textuelle Einsetzung. Der Preprozessor fügt einfach den Inhalt der Datei dort ein. Darum auch das Problem, wenn sich zwei Dateien gegenseitig includieren (quasi eine Rekursion ohne Abbruchbedingung).
Ein wesentlicher Vorteil von Vorwärtsdeklarationen (abgesehen davon, dass sich so zyklische Abhängigkeiten machen lassen), ist dass Deine Header voneinander entkoppelt werden. Das hat einen wesentlichen Einfluß auf die Kompilierdauer. Bei kleinen Projekten ist das egal, bei größeren Sachen mit einigen tausend Klassen willst du aber, dass bei einer Änderung an einem Header so wenig wie möglich neu gebaut werden muss. Daher soweit Möglich in Headern eher Vorwärtsdeklarationen benutzen!
P.S.: CDockWidget.h inkludiert "Tcp_Server.h" und andersrum...
beim #includen kann ich ja die Datei in <eckige_Klammern> angeben oder in "Gänsefüßchen" je nachdem ob bei additional Include folders oder im aktuellen Ordner gesucht werden soll. Wie ist das dann bei Vorwärstdeklarationen?
Weiterhin habe ich das mit Vorwärtsdeklarationen versucht:
1>..\Cmod_1.cpp(136) : error C2027: use of undefined type 'SpecialObject'
brax hat geschrieben:Durch die Vorwärtdeklaration sagst Du dem quasi Compiler nur, dass es eine Klasse mit dem Namen gibt. Da im Header nur ein Pointer auf ein Objekt dieser Klasse benutzt wird, braucht der Compiler auch gar nicht mehr darüber zu wissen. Erst wenn das Objekt, auf den der Pointer zeigt, wirklich benutzt wird, wird die eigentliche Definition gebraucht, daher muss dann natürlich das include in die cpp.
Achsoo, also im Header Vorwärtsdeklaration und gleichzeitig in dessen Source die #include?