Unklare CompilerFehlerMeldung



  • Hallo follgendes Problem

    ich habe eine abstrakte Klasse State.h
    Habe nur .h Datei angelegt.

    #ifndef STATE_H
    #define STATE_H
    
    #include "../impl/Automat.h"
    
    class State {
    
    protected:
    	bool final;
    
    public:
    	virtual ~State() =0;
    	/**
    	 * Gibt 1 zurueck, wenn der Zustand ein
    	 * Endzustand ist, sonst 0.
    	 */
    	bool isFinal() {
    		return final;
    	}
    
    	virtual void read(char c, Automat* m) = 0;
    
    };
    
    #endif /* STATE_H */
    

    Dann habe ich viele UnterKlassen States von 0 bis 10.
    Hier ist State0

    #ifndef STATE0_H_
    #define STATE0_H_
    
    #include "../../abstract/State.h"
    
    class State0 : public State { // FEHLER: expected class-name before '{' token
    
    public:
    	State0();
    	virtual ~State0();
    	void read(char c, Automat* m); //FEHLER: ISO C++ forbids declaration of `m' with no type
    };
    
    #endif /* STATE0_H_ */
    

    Dann habe ich noch eine Klasse Automat
    Hier ist .h

    #ifndef AUTOMATIMPL_H_
    #define AUTOMATIMPL_H_
    
    #include "../abstract/State.h"
    #include "../impl/states/State0.h"
    #include "../impl/states/State1.h"
    #include "../impl/states/State2.h"
    #include "../impl/states/State3.h"
    #include "../impl/states/State4.h"
    #include "../impl/states/State5.h"
    #include "../impl/states/State6.h"
    #include "../impl/states/State7.h"
    #include "../impl/states/State8.h"
    #include "../impl/states/State9.h"
    #include "../impl/states/State10.h"
    
    class State;
    
    class Automat{
    protected:
    	/** Der aktuelle Zustand des Automats. */
    	State* currentState;
    	/*enthaelt Zeiger auf alle 11 Zustaende*/
    	State* statePool;
    
    public:
    	Automat();
    	virtual ~Automat();
    
    	/**
    	 * Liest und bearbeitet ein Zeichen.
    	 */
    	void readChar(char);
    
    };
    
    #endif /* AUTOMATIMPL_H_ */
    

    Jetzt bekomme ich Fehler Meldung in allen State0.h bis State10.h und zwar immer an der gleichen stellen. Siehe oben State0.h Zeilen 6 und 11.

    Kann bitte jemand erklären was ich da falsch mache?

    Danke schon mal.



  • sieht etwas verstreuselt aus.

    Du bindest deine State-Header in die Automat-Header ein und dann in der State-Header nochmal die Automat-Header genau wie in jeder StateX-Header ⚠

    Des verwirrt nicht nur mich sondern auch deinen Compiler 😃

    Die Header in der Automat machen irgendwie erstmal keinen Sinn. Du machst ja da eh schon ne Vorwärtsdeklaration deiner State. Schau mal, obs dann schon geht. 😕



  • Das mache ich weil in meinem Automat alle Zustaende erstmal erstellt werden;

    void Automat::initAutomat(){
    
    	//init States
    	this->statePool 	= new State[11];
    
    	this->statePool[0]  = new State0();
    	this->statePool[1]  = new State1();
    	this->statePool[2]  = new State2();
    	this->statePool[3]  = new State3();
    	this->statePool[4]  = new State4();
    	this->statePool[5]  = new State5();
    	this->statePool[6]  = new State6();
    	this->statePool[7]  = new State7();
    	this->statePool[8]  = new State8();
    	this->statePool[9]  = new State9();
    	this->statePool[10] = new State10();
    
    	setCurrentState(0);
    
    }
    

    😕



  • versuche nachzuvollziehen, in welcher Reihenfolge die Header in den verschiedenen Klassen eingebunden werden. Bedenke dabei, dass durch die Präprozessordirektiven dies nur einmal geschieht.

    class State wird vor class Automat eingebunden > Vorwärtsdeklaration dann also hier unnötig. In State.h ist Automat also nicht bekannt, drum müsste dann hier die Klasse vorher bekannt gemacht werden.


Anmelden zum Antworten