Factory & Reflection
Verfasst: 03.07.2010, 21:27
Ein Problem im Zusammenhang mit http://zfx.info/viewtopic.php?f=7&t=794 aber es ist eigentlich ein getrenntes Thema.
Ich möchte meinen Entitys Komponenten hinzufügen können. Dafür muss ich ein Objekt einer Komponentenunterklasse erstellen, dessen Typ ich anhand eines Strings bestimme (damit ich das dynamisch zur Laufzeit machen kann). Jetzt ist die Frage, wie programmiere ich am besten eine Klasse, die einen String bekommt und das entsprechende Objekt erzeugt? (Die Klassen haben alle die selbe Oberklasse) Ich möchte natürlich möglichst einfach neue Klasse hinzufügen können, das sollte nicht mehr als eine Zeile benötigen.
Die einfachste Lösung wäre ein großes if/elseif aber das sieht hässlich aus und ich muss die Implementierung immer ändern.
Bis jetzt möchte ich das Prototypmuster benutzen. beim registrieren übergebe ich den Namen als String und ein Objekt der Klasse, beim erstellen suche ich den String aus einer map raus und kopiere das Objekt, das mit in der Map liegt und gebe das dann zurück. Ich kann mit einem Funktionsaufruf neue Klassen registrieren und muss nie die Implementierung meiner Factory ändern, was beides sehr schön ist, allerdings muss ich dafür sorgen, dass jede Komponentenklasse kopierbar ist.
Mein zweites Problem ist, dass sinnvolle bearbeiten von Komponenten im Editor. Ich würde gerne wxPropertyGrid benutzen, das Problem ist, dass ich dafür ja alle GUI Elemente erzugen müsste. Ferner will ich natürlich Komponenten laden und speichern können, das sind eine Menge simpler Funktionen, die ich eigentlich nicht selber schreiben will. Ich brauche als Reflection für C++.
Meine bisherige Idee ist, ein paar Makros zu definieren, die ich dann für jede Memberdeklaration benutze. Sie erstellen einerseits den Member mit dem normalen Namen, fügt aber andererseits dessen Adresse in eine Liste ein. So kann ich im Spiel ohne performanceverlus alle Member ganz normal nutzen, aber trotzdem über sie iterieren. Wie genau ich das mit der Liste jetzt mache, weiß ich allerdings noch nicht, man kann ja während der Deklaration nicht direkt Code ausführen, und void* Zeiger reichen sicherlich auch nicht aus.
Ich hätte also gerne Meinungen zu meiner Factory Planung und konkrete Vorschläge für Reflection.
Ich möchte meinen Entitys Komponenten hinzufügen können. Dafür muss ich ein Objekt einer Komponentenunterklasse erstellen, dessen Typ ich anhand eines Strings bestimme (damit ich das dynamisch zur Laufzeit machen kann). Jetzt ist die Frage, wie programmiere ich am besten eine Klasse, die einen String bekommt und das entsprechende Objekt erzeugt? (Die Klassen haben alle die selbe Oberklasse) Ich möchte natürlich möglichst einfach neue Klasse hinzufügen können, das sollte nicht mehr als eine Zeile benötigen.
Die einfachste Lösung wäre ein großes if/elseif aber das sieht hässlich aus und ich muss die Implementierung immer ändern.
Bis jetzt möchte ich das Prototypmuster benutzen. beim registrieren übergebe ich den Namen als String und ein Objekt der Klasse, beim erstellen suche ich den String aus einer map raus und kopiere das Objekt, das mit in der Map liegt und gebe das dann zurück. Ich kann mit einem Funktionsaufruf neue Klassen registrieren und muss nie die Implementierung meiner Factory ändern, was beides sehr schön ist, allerdings muss ich dafür sorgen, dass jede Komponentenklasse kopierbar ist.
Mein zweites Problem ist, dass sinnvolle bearbeiten von Komponenten im Editor. Ich würde gerne wxPropertyGrid benutzen, das Problem ist, dass ich dafür ja alle GUI Elemente erzugen müsste. Ferner will ich natürlich Komponenten laden und speichern können, das sind eine Menge simpler Funktionen, die ich eigentlich nicht selber schreiben will. Ich brauche als Reflection für C++.
Meine bisherige Idee ist, ein paar Makros zu definieren, die ich dann für jede Memberdeklaration benutze. Sie erstellen einerseits den Member mit dem normalen Namen, fügt aber andererseits dessen Adresse in eine Liste ein. So kann ich im Spiel ohne performanceverlus alle Member ganz normal nutzen, aber trotzdem über sie iterieren. Wie genau ich das mit der Liste jetzt mache, weiß ich allerdings noch nicht, man kann ja während der Deklaration nicht direkt Code ausführen, und void* Zeiger reichen sicherlich auch nicht aus.
Ich hätte also gerne Meinungen zu meiner Factory Planung und konkrete Vorschläge für Reflection.