Probleme mit Including
-
Hey!
Ich dachte, sowas würde mir nicht mehr passieren. Aber anscheinend habe ich keinen Plan, was ich da überhaupt tue.
Nun, das Klassendesign bitte nicht beachten, dies sind meine ersten Versuche... Es geht um Abhängigkeiten, ich habe versucht den Fehler so einfach wie nur möglich zu reproduzieren:
SceneNode.h
#pragma once class RenderManager; class SceneNode { virtual void Render(const RenderManager&); };SpriteNode.h
#pragma once #include "SceneNode.h" #include "RenderManager.h" // Wenn inkludiert => Fehler // class RenderManager; // So würde kein Fehler auftreten... class SpriteNode : public SceneNode { void Render(const RenderManager&); };RenderManager.h
#pragma once #include "SpriteNode.h" class RenderManager { void AddSpriteNode(SpriteNode*); };Und zwar Folgender Fehler:
rendermanager.h(7) : error C2061: syntax error : identifier 'SpriteNode'Wenn ich #include "RenderManager.h" in SpriteNode.h durch eine forward-declaration ersetze (class RenderManager;), dann tritt das Problem nicht auf.
Aber warum? Was mache ich falsch? Ein Konflikt? Es kann doch nicht so schwer sein, ein paar kleine Abhängigkeiten zu setzen, wie ist das denn dann mit großen Projekten?
Achja, noch etwas:
Wenn ich die forward-declaration "class RenderManager;" in SceneNode.h durch ein #include "RenderManager.h" ersetze, gibt es noch mehr Fehler:scenenode.h(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int scenenode.h(8) : error C2143: syntax error : missing ',' before '&' spritenode.h(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int spritenode.h(8) : error C2143: syntax error : missing ',' before '&' spritenode.h(7) : error C2504: 'SceneNode' : base class undefined spritenode.h(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int spritenode.h(8) : error C2143: syntax error : missing ',' before '&' rendermanager.h(7) : error C2061: syntax error : identifier 'SpriteNode'Was ist da los? Wie mache ich es besser? Auf was muss ich generell achten?
Früher habe ich nie forward declarations verwendet, und hatte soweit ich mich erinnern kann nie Probleme...Danke!
MfG
-
ceplusplus@loggedoff schrieb:
Es kann doch nicht so schwer sein, ein paar kleine Abhängigkeiten zu setzen
Wenn du zyklische Abhängigkeiten hast, schon:
RenderManager.h und SpriteNode.h binden sich gegenseitig ein, d.h. in RenderManager.h sagst du, dass der Inhalt von SpriteNode.h bekannt sein muss (also davor stehen muss), und in SpriteNode.h sagst du, dass der Inhalt von RenderManager.h bekannt sein muss. Denn genau das sagt die Includedirektive aus.
Diese Abhängigkeiten sind nicht auflösbar.
Durch die Pragmas wird der Kreis zwar aufgebrochen. Dann steht dadurch eben derjenige Header "hinten", der durch die jeweilige Übersetzungseinheit zuerst eingebunden wird, der andere steht "vorne". Aber eine der beiden Abhängigkeiten ist eben nicht erfüllt, daher die Fehlermeldungen.
-
MFK schrieb:
Dann steht dadurch eben derjenige Header "hinten", der durch die jeweilige Übersetzungseinheit zuerst eingebunden wird, der andere steht "vorne".
Wie meinst du das?
Und.. wie mache ich es dann richtig? Forward declarations kann man ja auch nicht immer verwenden...
Man wird dann ja eigentlich total eingeschränkt.MfG
-
ceplusplus@loggedoff schrieb:
[Und.. wie mache ich es dann richtig? Forward declarations kann man ja auch nicht immer verwenden...
Man wird dann ja eigentlich total eingeschränkt.Eigentlich garnicht. In der Regel deuten Probleme hiermit eher auf Designprobleme zurück. Echte zyklische Abhängigkeiten sollte man sprachunabhängig immer versuchen zu vermeiden.
Ganz davon abgesehen lassen sich ja alleine deine hier gezeigten Fälle mittels "Forward declaration" lößen. Nutze dies auch. Includes gehören soweit möglich immer in den Source (Reduzierung der Linkzeiten...).
Und wenn du dir ein Henne/Ei Probem schaffst, musst du damit klarkommen das Compiler nunmal nicht philosophisch sind

cu André
-
Hallo zusammen,
sollte das ganze etwas zu MFC lastig sein, hilft es, die
eigenen includes nach dem Eintrag#include <afxwin.h> // MFC core and standard components
in der stdafx.h einzutragen.
Gruß
jens Bonnermann
