Unknown type name



  • Hallo zusammen,

    ich wende mich an euch, weil ich ein wenig auf dem Schlauch stehe mit folgendem Code:

    #ifndef Galaxyt_Renderer_h
    #define Galaxyt_Renderer_h
    
    //Frameworks
    #include <SDL/SDL.h>
    #include <OpenGL/gl.h>
    #include <OpenGL/glu.h>
    
    //Classes
    #include "GameController.h"
    
    class Renderer {
    	GameController *myGameController;
    
    	SDL_Surface *gameWindow;
    
    public:
    	Renderer(GameController *newGameController, int width, int height); //Setting up the SDL window with provided width and height 	
    	~Renderer();
    
    	void render();
    };
    
    #endif
    

    und zwar wirft mir der Compiler in Zeile 15 und 20 dieses raus: "Unknown type name 'GameController'

    Meine Recherchen im Internet haben bisher ergeben, dass das was mit nicht korrekt include'ten Headern zu tun haben kann bzw. dass diese doppelt included sind, dies sollte aber doch durch das #ifndef... eigentlich nicht möglich sein.

    In allen anderen Klassen funktioniert das Einwandfrei, hat jemand eine Idee?

    Vielen Dank im Voraus!

    Anbei nochmal die GameController.h:

    #ifndef Galaxyt_GameController_h
    #define Galaxyt_GameController_h
    
    //Frameworks
    #include <SDL/SDL.h>
    
    //Classes
    #include "Renderer.h"
    
    #include "Galaxy.h"
    
    class GameController {
    
    	Galaxy *currentLevel;
    	Renderer *myRenderer;
    public:
    	GameController(); 
    	~GameController();
    
    	void mainMenu(); //Runs the main-menu
    	void gameLoop(); //Runs the gameloop
    
    	Galaxy *getCurrentLevel(); //Returns the current Level
    
    };
    
    #endif
    

  • Administrator

    Verfolge doch mal deine Includes und gehe es im Kopf durch. Ich zeig es dir mal auf, dann wirst du sofort sehen, was für einen Unsinn du da produziert hast 🙂

    Sagen wir mal, wir starten in GameController.h . Wir sind der Pre-Processor, gehen somit die Datei von oben nach unten durch. Wir gelangen irgendwann einmal zur Zeile 9 #include "Renderer.h" . Wir fügen somit den Inhalt aus der Renderer.h an dieser Stelle ein. Im eingefügten Bereich aus Renderer.h kommen wir zur Zeile #include "GameController.h" . Wir inkludieren hier also den Inhalt aus GameController.h . Wenn wir diesen Inhalt nun anschauen, finden wir heraus, dass Galaxyt_Renderer_h bereits definiert ist. Wir überspringen den eingefügten Bereich. Und dann geht es ans Ende. Das Resultat sieht dann ca. so aus:

    // ...
    
    class Renderer
    {
      // ...
    };
    
    // ...
    
    class GameController
    {
      // ...
    };
    
    // ...
    

    Wie du siehst, wird hier der GameController erst nach der Klasse Renderer definiert. Daher ist GameController in der Klasse Renderer unbekannt.

    Dein Problem ist somit die zyklische Inkludierung der Header. Sowas ist zwar erlaubt, erzeugt aber meistens ein ungewolltes Verhalten. Dem kann man allerdings Abhilfe leisten. In GameController verwendest du nur einen Zeiger auf einen Renderer . Daher würde hier eine Vorwärtsdeklaration absolut ausreichen. Nimm also aus GameController.h das #include "Renderer.h" raus und ersetze es mit der Vorwärtsdeklaration von der Klasse Renderer .

    Grüssli



  • Jetzt wo du es so sagst..... 🙂

    Ja was soll ich da noch groß zu sagen, ist ganz logisch. 😃

    Vielen Dank jedenfalls!


Anmelden zum Antworten