Kompiler erkennt eigene Klasse nicht als Datentyp an



  • Hallo!

    Ich, 14, (versuche) schreibe gerade ein Spiel. Dabei habe ich alle meine Klassen in den Namespace LEngine geschrieben. Jetzt habe ich in einer Klasse versucht eine andere Klasse als Variable anzulegen, IntelliSense erkennt auch alles, aber mein Compiler (VCExpress 2010) erkennt die Klasse nicht an und sagt mir folgenden Fehler:

    error C2143: Syntaxfehler: Es fehlt ';' vor '*'

    .

    Der Code sieht so aus:
    Material.h:

    namespace LEngine
    {
    	class Material:protected Base
    	{
    	protected:
    		//... gekürzt ...
    	public:
    		//... gekürzt ...
    	};
    };
    

    Entity.h:

    namespace LEngine
    {
    
    	class Entity:protected Renderable
    	{
    	protected:
    		//... gekürzt ...
    		Material *m_pMaterial; //Hier soll der Fehler sein...
    	public:
                    //... gekürzt ...
    	};
    };
    

    Ich habe es auch expizit mit

    LEngine::Material *m_pMaterial
    

    probiert, IntelliSense erkennt's, der Compiler sagt nur:

    error C2039: 'Material': Ist kein Element von 'LEngine'

    Ich bitte um Hilfe, weil ich nicht weiß was ich falsch mache.

    mfg Calk

    PS: Ja es wird alles includiert usw. , der Code der Basisklassen ist auch richtig.



  • Calk schrieb:

    PS: Ja es wird alles includiert usw.

    Vermutlich wird zuviel includiert. Binden sich zufällig Material.h und Entity.h gegenseitig ein?



  • Lies mal das hier.
    Ich vermute auch, dass es an dem liegt, was MFK anspricht. Und in dem Link ist erklärt was das Problem ist und was du dagegen tun kannst.



  • Kenn ich. Und einbinden tut sichs auch nicht da am Anfang und Ende immer (bei .h's) steht:

    #ifndef __NAME_DER_DATEI__
    #define __NAME_DER_DATEI__
    //CODE usw. ...
    #endif//__NAME_DER_DATEI__
    

    .

    Und sie benötigen sich nicht gegenseitig, nur Entity braucht Material.



  • Headerguards helfen bei dem Problem ja auch nicht.

    Du darfst gar keine includes machen. Wenn dus nicht glaubst, dann ersetz mal die includes der Dateien mit Vorwärtsdeklarationen (beachte den verlinkten Artikel was du dann aber aber im Header stehen haben darfst).



  • Calk schrieb:

    Und einbinden tut sichs auch nicht da am Anfang und Ende immer (bei .h's) steht:

    Include-Guards verhindern Fehler durch zyklische Includes nicht. Sie brechen nur den Zyklus irgendwo auf.

    Calk schrieb:

    Und sie benötigen sich nicht gegenseitig, nur Entity braucht Material.

    Was nicht bedeutet, dass Material nicht doch über Umwege Entity einbindet. Hast du das geprüft?



  • LEngine würde ich auch nicht anerkennen.



  • Ich glaube schon.
    Egal, jetzt habe ich bereits mal alles gegenseitig neu eingebunden und jetzt geht es. Danke.

    mfg Calk

    PS: Das andauernde Neuschreiben macht mir nix, ich hatte früher mal so nen 400mhz Laptop auf dem ich nur programmiert habe und da kannte ich die einfg-Taste nicht. Also habe ich immer alles neu geschrieben wenn ich darauf drückte, ich wollte nicht im Einfügen-Schreib-Modus weitermachen 😉 .



  • Calk schrieb:

    Egal, jetzt habe ich bereits mal alles gegenseitig neu eingebunden und jetzt geht es.

    Die Lösung ist nicht, solange mit den Include-Direktiven rumzufrickeln, bis es wieder geht. Das Problem wird dich irgendwann wieder einholen.


Anmelden zum Antworten