Problem mit den namespaces



  • Hallo, ich habe mehrere Dateien in unterschiedlichen Ordnern die ich ein binden möchte.

    controller/playerController.h:

    #include "../inputHandler/playerInputHandler.h"
    
    namespace zombie {
      namespace controller {
    
       class PlayerController : public scape::physics::RigidBodyController {
       private:
          ....
       };
      }
    }
    

    inputhandler/playerInputHandler.h:

    #include "../controller/playerController.h"
    
    namespace zombie {
      namespace inputhandler {
    
       class PlayerInputHandler : public scape::logic::message::MessageTopicSubscriber, public scape::core::RefCounted {
    	private:
    	 zombie::controller::PlayerController * m_playerController;
    	 void registerListener();
    
    	public:
    	 PlayerInputHandler(controller::PlayerController * playerController);
    	 virtual void receiveMessage(scape::logic::message::Message * msg);
    
       };
      }
    }
    

    Das sind jetzt Ausschnitte aus den 2 Dateien um die es geht, der Fehler den ich bekomme ist:

    ../../src/player/../controller/../inputHandler/playerInputHandler.h:8: error: ‘zombie::controller’ has not been declared
    ../../src/player/../controller/../inputHandler/playerInputHandler.h:8: error: ISO C++ forbids declaration of ‘PlayerController’ with no type
    ../../src/player/../controller/../inputHandler/playerInputHandler.h:8: error: expected ‘;’ before ‘*’ token
    ../../src/player/../controller/../inputHandler/playerInputHandler.h:12: error: ‘zombie::controller’ has not been declared
    ../../src/player/../controller/../inputHandler/playerInputHandler.h:12: error: expected ‘)’ before ‘*’ token
    

    Ich programmiere erst seit knapp nem Monat c++ und mit der Klassenstruktur und den namespaces komme ich noch nicht so klar 🙂



  • - Diese starke Verschachtelung von Namensräumen ist total übertrieben und bringt gar nichts.
    - Du hast eine zyklische Header-Abhängigkeit. Versuch die aufzulösen
    - Ich sehe gar keine Include-Guards

    Mach Dich schlau, wie "getrennte Übersetzung" funktioniert, und wozu Header-Dateien da sind. Kann man in schlauen Büchern nachlesen. Ich habe bestimmt auch schon mindestens 3mal versucht, das hier zu erklären. Bin jetzt zu faul dazu. Streng Dich mal'n bissel an! :p

    Gruß,
    SP



  • is gar nich so schwer zu beheben... mach das include weg und tu es in die cpp und schreibe

    PlayerInputHandler(class controller::PlayerController * playerController);
    

    oder

    PlayerInputHandler(struct controller::PlayerController * playerController);
    

    je nach dem, als was es definiert ist(sonst bekommst du zumindest beim msvc ne hässliche warnung, weil der angst hat, dass du was anderes meint, als er "denkt")

    bb



  • Hallo,

    1. Unser Projekt ist schon ziemlich umfangreich, und es ich finde es übersichtlicher.

    2. Die kann ich nicht auflösen, die brauchen ja beide einen Zeiger aufeinander ?! Es ging ja auch noch alles bevor ich sie in eigene source Ordner verschoben habe.

    3. was sind include-Guards ? meinst du damit
    #ifndef PLAYERCONTROLLER_H_
    #define PLAYERCONTROLLER_H_

    und sowas ? Die hab ich drin 🙂

    Ja mit der getrennten Übersetzung hört sich schon gut an ^^, wenn du es schon 3 mal Erklärt hast bin ich auch mit einem link zu deinen früheren Beitragen zufrieden :-).

    Gruesse



  • unskilled schrieb:

    is gar nich so schwer zu beheben... mach das include weg und tu es in die cpp und schreibe

    Hallo, ich habe es ja extra ausgelagert weil es sonnst viel zu unübersichtlich ist und ich auch noch von anderen Klassen den Controller einbinden möchte



  • So, wie ich das sehe brauchst du die includes gar nicht. Lies mal das hier:
    http://drakon.ch/?id=&offset=&mobile=0&show_entry=77

    Ist eigentlich empfehlenswert die Abhängigkeiten so weit, wie möglich zu vermeiden. Hilft auch gegen zyklischen Includes.



  • drakon schrieb:

    So, wie ich das sehe brauchst du die includes gar nicht.

    Sag ich doch...

    @eicon:
    du sollst ja auch das machen, was ich geschrieben habe und dir nicht irgendwas zusammendichten xD
    noch mal:

    /*header, alt*/
    #include "../controller/playerController.h"
    
    namespace zombie {
      namespace inputhandler {
    
       class PlayerInputHandler : public scape::logic::message::MessageTopicSubscriber, public scape::core::RefCounted {
        private:
         zombie::controller::PlayerController * m_playerController;
         void registerListener();
    
        public:
         PlayerInputHandler(controller::PlayerController * playerController);
         virtual void receiveMessage(scape::logic::message::Message * msg);
    
       };
      }
    }
    
    /*header neu*/
    
    namespace zombie {
      namespace inputhandler {
    
       class PlayerInputHandler : public scape::logic::message::MessageTopicSubscriber, public scape::core::RefCounted {
        private:
         zombie::controller::PlayerController * m_playerController;
         void registerListener();
    
        public:
         PlayerInputHandler(class controller::PlayerController * playerController);
         virtual void receiveMessage(scape::logic::message::Message * msg);
    
       };
      }
    }
    
    /*source alt*/
    #include "header.h"
    
    /*impl*/
    
    /*source neu*/
    #include "header.h"
    #include "andererheader.h"
    
    /*impl, bleibt wie gehabt*/
    

    bb



  • Ja mit der getrennten Übersetzung hört sich schon gut an ^^, wenn du es schon 3 mal Erklärt hast bin ich auch mit einem link zu deinen früheren Beitragen zufrieden 🙂

    Ich habe alles gesagt, was ich sagen wollte. Jetzt, diese Links rauszusuchen, oder diese Basics runterzubeten, die ja in jedem guten Buch besser erklärt stehen, mache ich nicht.



  • unskilled schrieb:

    drakon schrieb:

    So, wie ich das sehe brauchst du die includes gar nicht.

    Sag ich doch...

    Sorry, das scheine ich überlesen zu haben, aber ich denke der Link kann trotzdem auch helfen.



  • drakon schrieb:

    So, wie ich das sehe brauchst du die includes gar nicht. Lies mal das hier:
    http://drakon.ch/?id=&offset=&mobile=0&show_entry=77

    Ist eigentlich empfehlenswert die Abhängigkeiten so weit, wie möglich zu vermeiden. Hilft auch gegen zyklischen Includes.

    Ja, die Seite hat mir sehr geholfen hab es jetzt hin bekommen. Danke auch an die anderen.

    Gruesse 🙂


Anmelden zum Antworten