Factory Pattern



  • hi kann mir jemand sagen was an dem text nicht stimmt?

    danke im vorraus

    #include <iostream>
    
    using namespace std;
    
    class Window;
    class Renderer;
    
    class Device
    {
    private:
    	Device(void);
    	virtual ~Device(void);
    
    private:
    	enum DeviceType
    	{
    		DEVICE_WINDOW		= 0,
    		DEVICE_RENDERER
    	};
    
    public:
    	static Device* create(DeviceType type)
    	{
    		switch(type)
    		{
    		case DEVICE_WINDOW:
    			return(new class Window());
    		case DEVICE_RENDERER:
    			return(new class Renderer());
    		}
    
    		return 0;
    	}
    
    };
    
    class Window : public Device
    {
    public:
    	Window(void);
    	~Window(void);
    };
    
    class Renderer : public Device
    {
    public:
    	Renderer(void);
    	~Renderer(void);
    };
    
    int main(void)
    {
    
    	return 0;
    }
    

    ciao NwP



  • Schreibe return new Window() statt return new class Window()



  • B.Sc. Inf. schrieb:

    Schreibe return new Window() statt return new class Window()

    Das ist kein Fehler.



  • NwP schrieb:

    hi kann mir jemand sagen was an dem text nicht stimmt?

    Keine Ahnung, was stimmt den nicht? ( Fehlermeldung? Unerwünschte Ergebnisse?? "Seltsames" Verhalten??? )



  • Zeile 18 fehlt ne Wertzuweisung(?)
    Sonst ist DEVICE_RENDERER auch 0(?) und die Factory liefert immer nen Window



  • Nein, der meint:

    error C2512: 'Window': Kein geeigneter Standardkonstruktor verfügbar
    error C2512: 'Renderer': Kein geeigneter Standardkonstruktor verfügbar

    Aber warum?



  • vielleicht weil der Konstruktor ers nach dem Aufruf da steht?



  • Hallo,
    ein Problem ist, dass an dem Punkt wo ein neues Window bzw. ein Renderer erzeugt werden sollen lediglich eine Vorwärtsdeklaration der beiden Klassen existiert. Für die Erzeugung eines Objekts benötigt man aber die vollständige Klassendefinition.

    So geht's:

    #include <iostream>
    
    using namespace std;
    class Device
    {
    private:
        Device(void);
        virtual ~Device(void);
    
    private:
        enum DeviceType
        {
            DEVICE_WINDOW        = 0,
            DEVICE_RENDERER
        };
    
    public:
        static Device* create(DeviceType type);
    
    };
    
    class Window : public Device
    {
    public:
        Window(void);
        ~Window(void);
    };
    
    class Renderer : public Device
    {
    public:
        Renderer(void);
        ~Renderer(void);
    };
    
    Device* Device::create(DeviceType type) {
      switch(type)
      {
      case DEVICE_WINDOW:
        return(new Window());
      case DEVICE_RENDERER:
        return(new Renderer());
      }
      return 0;
    }
    
    int main(void) {
      return 0;
    }
    

    Sonderlich sinnvoll ist es aber nicht.



  • sag ich doch



  • Du solltest DeviceType public machen, sonst kann man von außen doch gar nicht angeben was für ein Device man haben möchte.



  • wie passt das eigentlich zusammen? Device Window und Renderer? Was haben die jetzt gemeinsam?


Anmelden zum Antworten