StatePattern Zyklische Includes auflösen



  • Hallo,

    Ich bin dabei mir die Patterns in C++ näher zu bringen, in Java habe ich einige schon durchgemacht aber jetzt habe ich irgendwie ein paar Probleme und komm nicht auf die Lösung, z.B. mit den Zyklischen Includes wie ich diese auflöse oder ob ich meine Dateien falsch organisiere.

    Ich wollte Eigentlich nur ein Licht mit dem StatePattern nachbilden, jede Klasse/State in einer eigenen Datei.

    Licht.h

    #pragma once
    
    #include "State.h"
    
    class Licht
    {
    public:
    
    	State* state;
    
    			Licht	(){ this->state = new Aus(); }
    			virtual ~Licht(){}
    
    	void	setState	(State *s){ state = s; }
    	void	an			(){ this->state->an(this); }
    	void	aus			(){ this->state->aus(this); }
    };
    

    State.h

    #pragma once
    
    #include <iostream>
    
    #include "Licht.h"
    
    class State
    {
    public:
    	virtual void an(Licht *l)
    	{
    		std::cout << "Licht ist schon an" << std::endl;
    	}
    	virtual void aus(Licht *l)
    	{
    		std::cout << "Licht ist schon aus" << std::endl;
    	}
    };
    

    An.h

    #pragma once
    
    #include "State.h"
    
    //class Licht;
    class An : public State
    {
    public:
    	An(){}
    	~An(){}
    
    	void aus(Licht *l)
    	{
    	/*	std::cout << "Das Licht ist aus" << std::endl;
    		l->setState(new An());
    		delete this;*/
    	}
    };
    

    Aus.h

    #include "State.h"
    
    class Aus : public State
    {
    public:
    	Aus(){}
    	~Aus(){}
    
    	void an(Licht *l)
    	{
    		std::cout << "Das Licht ist aus." << std::endl;
    		/*l->setState(new An());
    		delete this;*/
    	}
    };
    

    Vielen Dank für die Hilfe!
    Gruß
    reisman



  • Stichwort: Vorwärtsdeklarierung. Wenn du die Dateien alle in einer Datei zusammen bekommst, hast du automatisch die Aufteilung, die du brauchst, um es mit mehreren Dateien hinzubekommen.

    Ich hoffe außerdem, dass die Klassen einfach nur Beispiele zur Übung sind 😉



  • Ich hab nun das Problem gelöst aber ob es optimal ist weiß ich nicht

    patrick246 schrieb:

    ...
    Ich hoffe außerdem, dass die Klassen einfach nur Beispiele zur Übung sind 😉

    Ist natürlich alles nur zur Übung, aber was wäre verbesserungswürdig,
    die Namen der Klassen ?

    • In Licht.h nur die konkreten States inkludieren. (Aus.h und An.h)
    • In State.h nur eine Vorwärtsdeklarierung der Klasse Licht.
    • In An.h nur State.h inkludieren UND die Methoden in An.cpp Dateien auslagern und dort Licht.h inkludieren. Das selbe gilt für Aus.h, also nur State.h inkludieren und Methode in Aus.cpp auslagern und dort Licht.h inkludieren.


  • Da Licht seine Zustände kennt (in Form der Methoden an und aus) macht es keinen Sinn diese als Klassen zu haben. Da tuts auch ein enum und ein if/switch. Aber gut, als Übung kann man das ja machen.

    Die Lösung scheint soweit in Ordnung zu sein.


Anmelden zum Antworten