Objekt erstellen wenn der Klassenname Variabel ist?



  • Du kannst in deiner Tabelle neben dem Wert "blau" auch das entsprechende prototypische Objekt speichern. Dieses sollte eine Methode Clone anbieten, mit der gleiche Objekte erzeugt werden. Das ist aber nur eine Moeglichkeit, das Factory Pattern bietet dir weitere.



  • Gehe eine Indirektion weiter. Im Code fest eingebaut machst du das so hnlich wie du es bisher gemacht hast, also ein Mapping von einer Konstanten X auf eine Klasse C, das damit fest verdrahtet ist. In der Tabelle trägst du dann Paare von Konstanten (Y, 😵 ein, die das konfigurierbare Mapping machen. Zur Laufzeit liest du dann das Y als Parameter, findest an Hand der Tabelle das X und erzeugst dadurch das C.



  • class CColor
    {
    public:
    
    	virtual CColor *create()
    	{
    		return new CColor();
    	}
    };
    
    class CBlue : public CColor
    {
    public:
    
    	virtual CColor *create()
    	{
    		return new CBlue();
    	}
    };
    
    struct COLOR
    {
    	const char *Name;
    	CColor *Creator;
    };
    
    COLOR colors[1] =
    {
    	{"blue", new CBlue} //muss natürlich wieder deleted werden
    };
    
    //oder:
    
    std::map<std::string, CColor*> colors;
    colors["blue"] = new CBlue(); //muss natürlich wieder deleted werden
    
    //Benutzung:
    CColor *col = colors["blue"]->create();
    

    Ist nicht besonders schön, aber vielleicht ein Ansatz oder so.



  • Oder du erstellst eine abstrakte Basisklasse "IFarbe", von der alle Farben erben. Somit kannst du ganz ohne if und else einfach farbePtr = new CRot oder farbePtr = new CBlau schreiben, das nennt man polymorphie!



  • Guter Rat schrieb:

    Oder du erstellst eine abstrakte Basisklasse "IFarbe", von der alle Farben erben. Somit kannst du ganz ohne if und else einfach farbePtr = new CRot oder farbePtr = new CBlau schreiben, das nennt man polymorphie!

    Naja - das hilft einem bei der Benutzung der Objekte - aber nicht bei der Erzeugung, um die es hier geht.
    Die ganze schöne Polymorphie ändert nichts daran, dass hinter dem "new" der konkrete Klassenname kommen muss (auch wenn man ihn in einen template parameter, eine factory oder oder oder auslagert).

    Gruß,

    Simon2.



  • Danke, für die schnelle Antworten. Mit dem Gedanken an eine Factory hatte ich auch schon gespielt. Ich hatte nur nicht soweit gedacht wie TyRoXx, der Kniff mit der Creator Methode ist nicht schlecht.





  • Keldan schrieb:

    Mit dem Gedanken an eine Factory hatte ich auch schon gespielt. Ich hatte nur nicht soweit gedacht wie TyRoXx, der Kniff mit der Creator Methode ist nicht schlecht.

    Der "Kniff" mit der Creator Methode wie es TyRoXx macht, ist IMO Kacke, da er dadurch die Factory und das zu erzeugende Objekt vermischt.



  • hustbaer schrieb:

    Der "Kniff" mit der Creator Methode wie es TyRoXx macht, ist IMO Kacke, da er dadurch die Factory und das zu erzeugende Objekt vermischt.

    Sehe ich genauso.
    Also ein den Objekten paralleles Klassenbüschel aufmachen. Die erben praktischerweise von einer gemeinsamen Basis. Um sie besser basteln zu können, sind sie praktischerweise Templateinstanziierung4n desselben templates. Klassenname und Klassenbeschreibungsstring möchte ich nur einmal eingeben, da hilft nur ein wenig Makro-Zauberei. Und als Sahnehäubchen ein wenig RTTI.

    Aver wenn TyRoXx' Kniff erstmal das ist, was Keldan suchte, ist für mich die Welt in Ordnung. Muß ja nicht alles auf einmal sein.





  • @knivil: Falls das auf die Diskussion über TyRoXx's Vorschlag bezogen ist...

    Das Prototype Pattern ist was anderes. Da geht's um das Klonen von Objekten einer Klasse.

    Der Code den TyRoXx gepostet hat klont aber nicht. Dazu müsste er den Copy-Ctor verwenden, was er nicht tut. Davon abgesehen sollte die Methode dann wohl "clone" und nicht "create" heissen. Und die Bedingung eine Klasse trifft auch nicht zu...


Anmelden zum Antworten