Kann Pointer auf ein Objekt in einer anderen Klasse nicht erstellen



  • Hi,

    Ich habe die Klasse "ScrollableListElement" und die soll einen static Pointer auf ein Objekt der Klasse "MainMenu" haben. Er sagt mir aber immer C++ forbids declaration of 'MainMenu' with no type. "MainMenu" habe ich aber bei den includes eingebunden, ich weiß echt nicht wo da der Fehler ist:

    ScrollableListElement.h:

    #ifndef SCROLLABLE_LIST_ELEMENT_H
    #define SCROLLABLE_LIST_ELEMENT_H
    
    #include <string>
    #include <pspgu.h>
    #include <pspgum.h>
    
    #include "Renderer.h"
    #include "Controllable.h"
    #include "GuiObject.h"
    #include "fontloader.h"
    #include "MainMenu.h"
    
    class ScrollableListElement : public Controllable, public GuiObject {
    
    private:
    	// [...]
    
    	static MainMenu *mm;  // Hier meckert er
    	static Controls *ch;
    
    	// [...]
    };
    

    Was mach ich denn da falsch?



  • Wenn in MainMenu.h wirklich 'MainMenu' deklariert ist (und keinen eigenen Namespace benutzt), dann sollte es keinen Fehler geben - so könnte man einfach denken...

    Ich tippe darauf, daß du eine Cross-Reference erzeugt hast, d.h. die beiden Header-Dateien 'ScrollableListElement.h' und 'MainMenu.h' inkludieren sich gegenseitig - und das führt dann zu 'merkwürdigen' Fehlermeldungen.

    Um dem zu entgehen, benutzt man Vorwärtsreferenzen (Forward references) - einfach mal danach im Forum oder Internet suchen.

    Hier also die Lösung für dein Problem:

    class MainMenu; // und #include "MainMenu.h" nicht mehr verwenden
    

    Nur in der Implementationsdatei (ScrollableListElement.cpp) mußt du dann die vollständige Deklaration von MainMenu kennen, d.h. "MainMenu.h" inkludieren.

    P.S: Es scheint aber kein gutes Klassendesign zu sein, daß du innerhalb eines Controls eine statische Instanz eines Menüs einbindest -> aber auch das wirst du sicherlich noch lernen -)



  • Danke für die Antwort, und ja, es ist genau das mit der "Cross-Reference". Danke auf jeden Fall, werd mich mal nach ner besseren Lösung umsehen 🙂


Anmelden zum Antworten