Java Umsteigeprobleme



  • GrafToericht schrieb:

    ...
    ...

    //Datei Menu.cpp
    Menu (Game *pointerGame) //Der Compiler meckert schon, wenn da was anderes als "const" steht 
    ....
    

    ...

    Magst Du das etwas qualifizierter schildern ?
    WO in den jeweiligen Dateien steht das ?
    In den Konstruktoren ? (also Game::Game(...) und Menu::Menu(...)) In "const-Funktionen" ?

    Gruß,

    Simon2.



  • Um jetzt mal allzu umständlichen Schilderungen aus dem Weg zu gehen, hier der Code:

    //Datei Game.hpp
    #include "Menu.hpp"
    
    class Game
    {
          public:
                 Game();
    
                 int galaxySize;
                 int numPlayers;
    
                 Menu *pointerMenu;        
    };
    
    //Datei Game.cpp
    #include "Game.hpp"
    
    Game::Game() 
    {
                 pointerMenu = 0;
    
                 pointerMenu = new Menu(this);
    }
    
    //Datei Menu.hpp
    //#include "Game.hpp" Kann ich nicht machen sonst "include nested too deeply"
    
    class Menu
    {
          public:
    
          Menu(Game *pointerGame);
    };
    
    //Datei Menu.cpp
    #include "Menu.hpp"
    
    Menu :: Menu (Game *pointerGame)
    {
             pointerGame->galaxySize = 25;
             pointerGame->numplayers = 100;
    
    }
    

    Das Gedankliche Problem was dahintersteht ist, daß das Menü ja auf Eingabe des Users wartet und diese dann an das Spiel weiterreicht, wenn der User bestätigt.

    Deswegen muss das Menu ja das Spiel referenzieren können, nachdem es selbst von dem Spiel instanziiert wurde (ich habe das mit "this" als Konstruktorparameter versucht).

    Nur kann ich ja die Headerdateien nicht gegenseitig includen, sonst gibts ja ne Endlosschleife...



  • Du mußt die Game.hpp in der Menu.cpp inkludieren, weil du sie da brauchst. In der Menu.hpp muß der Compiler nur wissen, dass eine Klasse Game existiert. Dafür nimmt man eine forward-Deklaration

    //Datei Menu.hpp
    //#include "Game.hpp" Kann ich nicht machen sonst "include nested too deeply" - Richtig
    // statt dessen
    class Game;
    
    class Menu
    {
          public:
    
          Menu(Game *pointerGame);
    };
    


  • Danke Braunstein, aber nachdem ich das geändert habe bekomme ich immernoch nen Fehler nämlich:

    10 C:\Dev-Cpp\PointerProject\Game.hpp ISO C++ forbids declaration of `Menu' with no type

    Also hier in Zeile 12 der Game.hpp kennt er Menu nicht..



  • Sollte er aber kennen. Mach mal in der Game.hpp eine forward-Deklaration für die Klasse Menu.
    Man sollte sowieso möglichst keine Header in anderen Headern inkludieren.
    Warum setzt du eigentlich pointerMenu im Konstruktor vor dem new auf 0? Das ist unnötig.



  • Stand in meinem C++ Buch, aus Sicherheitsgründen.

    Mit der Forward-Deklaration bekomme ich folgendes ausgeworfen:

    C:\Dev-Cpp\PointerProject\Game.cpp In constructor Game::Game()': C:\\Dev-Cpp\\PointerProject\\Game.cpp invalid use of undefined typestruct Menu'
    C:\Dev-Cpp\PointerProject\Game.hpp forward declaration of `struct Menu'

    Bin völlig ratlos 😞



  • Ja in der Game.cpp darfst Du dann jedoch Menu.hpp zusätzlich inkludieren 😉



  • *Auf die knie fall*

    Vielen Dank mal wieder an alle die geholfen haben. Es hat gerade kompiliert und funzt wie es soll. *megafreu*

    Das mit der Vorabdeklaration kannte ich noch gar nicht, und die Sache mit den includes hat es ein wenig in sich, weil man das von Java zumindest in dem Umfang nicht kennt.


Anmelden zum Antworten