[SOLVED] Headerdateien inkludieren



  • Hallo Leute,

    ich habe ein Problem, welches mit Header-Dateien und dem Inkludieren dieser zusammenhängt. Und zwar programmiere ich grad ein Spiel. Dafür habe ich eine Game Klasse, in der halt alles zusammenkommt und das Spiel an sich "zusammengebaut" wird. Es werden also in der Game.h fast alle Klassen (wie bsp. Player, Texture, InputHandler, ...) inkludiert, um sie ja dann im Spiel zu verwenden.

    Nun ist in der Game.h auch mein Renderer-Objekt SDL_Renderer* renderer (Ich benutze SDL für mein Spiel) deklariert, welchen ich bsp. in der Texture-Klasse benötige, um die Grafiken zu zeichnen.

    Dementsprechend inkludiere ich in der Headerdatei der Texture Klasse die Game.h, um dann über eine Methode getRenderer() Zugriff auf SDL_Renderer* zu bekommen. Ich bekomme aber sehr viele Compiler Fehler, wenn ich dies tue. Wahrscheinlich weil in der Game.h die Texture.h inkludiert ist und umgekehrt.

    Ich verwende aber folgendes Prinzip in jeder Headerdatei, um genau solchen nervigen #include-Problemen entgegenzuwirken:

    #ifndef __Game__
    #define __Game__
    
    (...)
    
    #endif __Game__
    

    Was könnte das Problem sein?
    Ich hoffe jemand kann mir helfen.
    Danke 🙂

    EDIT:

    Das wären die Compiler-Fehler:

    error C2065: 'btnTexture': nichtdeklarierter Bezeichner
    (in Button.h)

    error C2143: Syntaxfehler: Es fehlt ';' vor '*'
    (in InGame.h)

    error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'btnTexture'
    (an vielen Stellen, an denen ich die Texture-Klasse benutze))

    error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    (an vielen Stellen, an denen ich die Texture-Klasse benutze)



  • ich rate einfach mal: circular dependency
    Wenn der Compiler Fehler gibt, ist es generell eine gute Idee diese auch mitzuteilen



  • Forwarddeclaration könnte Dein Problem lösen.



  • Das wären die Compiler-Fehler:

    error C2065: 'btnTexture': nichtdeklarierter Bezeichner
    (in Button.h)

    error C2143: Syntaxfehler: Es fehlt ';' vor '*'
    (in InGame.h)

    error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'btnTexture'
    (an vielen Stellen, an denen ich die Texture-Klasse benutze))

    error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    (an vielen Stellen, an denen ich die Texture-Klasse benutze)



  • Wenn ich allerdings, die Game.h nur in die Texture.cpp inkludieren, dann funktioniert alles einwandfrei. Ich brauche ja auch den Renderer nur in der .cpp der Texture Klasse, da ich ja nichts deklarieren muss. Das so zu machen ist halt nur nicht schön und richtig oder?



  • mgaeckler schrieb:

    Forwarddeclaration könnte Dein Problem lösen.

    Das werde ich gleich mal versuchen. 🙂



  • Nur mal so als Tipp: Die Fehlermeldungen sind ohne zugehörigen Code relativ wertlos. Da du nicht deinen ganzen Code hier posten kannst und willst, gehst du am besten so vor: Du löschst aus deinem Code solange überflüssigen Kram, bis er so klein ist, dass du nichts mehr löschen kannst ohne dass der Fehler verschwindet. Das Ergebnis postest du dann hier.



  • huzzm schrieb:

    Wenn ich allerdings, die Game.h nur in die Texture.cpp inkludieren, dann funktioniert alles einwandfrei. Ich brauche ja auch den Renderer nur in der .cpp der Texture Klasse, da ich ja nichts deklarieren muss. Das so zu machen ist halt nur nicht schön und richtig oder?

    Was soll daran hässlich oder falsch sein?



  • huzzm schrieb:

    mgaeckler schrieb:

    Forwarddeclaration könnte Dein Problem lösen.

    Das werde ich gleich mal versuchen. 🙂

    Ich habs jetzt mit einer Vorwärtsdeklaration versucht, allerdings kommt dann der Linker-Fehler:
    error LNK1120: 1 nicht aufgelöste Externe

    Dieser kommt immer, wenn man eine Funktion nur deklariert, nicht aber implementiert. Dabei funktioniert eine Vorwärtsdeklaration doch so... 😞



  • Das ist ein Linker-Fehler, d.h. die Implementation der Funktion mußt du schon mitgeben (nur kann diese eben dann in einer anderen Code-Datei oder Library sein).



  • Th69 schrieb:

    Das ist ein Linker-Fehler, d.h. die Implementation der Funktion mußt du schon mitgeben (nur kann diese eben dann in einer anderen Code-Datei oder Library sein).

    Ja genau. Ich habe ja die Funktion in einer anderen Klasse in einer anderen Datei implementiert. Vielleicht habe ich etwas Anderes bei der Vorwärtsdeklaration falsch gemacht:

    In der Texture.h:

    SDL_Renderer* getRenderer();
    
    class Texture
    {
      (...)
    };
    

    Benutzt wird die vorwärtsdeklarierte Funktion getRenderer() allerdings nur innerhalb von Memberfunktionen der Texture-Klasse in der Texture.cpp Datei!

    In der Game.h:

    class Game
    {
    private:
      SDL_Renderer* renderer;
    public:
      SDL_Renderer* getRenderer()
      {
        return renderer;
      }
    };
    

    Habe ich die Vorwärtsdeklaration richtig angewandt?



  • huzzm schrieb:

    Habe ich die Vorwärtsdeklaration richtig angewandt?

    Nein, deine Deklaration ist eine freie Funktion, keine Memberfunktion der Klasse Game. Wenn Texture diese aufrufen will, braucht es die ganze Definition der Klasse Game.



  • Nathan schrieb:

    huzzm schrieb:

    Habe ich die Vorwärtsdeklaration richtig angewandt?

    Nein, deine Deklaration ist eine freie Funktion, keine Memberfunktion der Klasse Game. Wenn Texture diese aufrufen will, braucht es die ganze Definition der Klasse Game.

    Heißt also, ich muss noch die Klasse Game vorwärtsdeklarieren?

    class Game;
    SDL_Renderer* Game::getRenderer();
    

    Außerdem würde ich gerne noch wissen, ob es die Vorwärtsdeklaration irgendwie beeinträchtigt, wenn die beiden Dateien in unterschiedlichen Unterordnern sind, aber halt im gleichen Projektordner.



  • Nein, du kannst das nicht vorwärts deklarieren.
    Dss geht nicht.



  • Nathan schrieb:

    Nein, du kannst das nicht vorwärts deklarieren.
    Dss geht nicht.

    Oh ok schade.


Anmelden zum Antworten