2012-08-17 13 views
5

Ich verwende Luabind, um meine Spiel-Engine für Lua freizulegen. Kürzlich geriet ich in Schwierigkeiten, als ich herausfand, dass es für mich keine Möglichkeit gibt, ein "neues" z. GUIObject * obj = new GUIObject() in Lua, stattdessen ist alles, was in Lua erstellt wurde, im Besitz von Lua.C++ Template-Methode zum Erstellen von Objekten

Nun, das war kein großes Problem Ich entschied mich, nur eine Art Factory-Muster auf Objekte für z. mein GUIManager Hat

class GUIManager { 
template <class T> T * CreateObject(T classType) 
{ 
    return new T(); 
} 
} 

Meine Luabind Bindungen wie folgt aussehen:

class_<GUIManager>("GUIManager") 
     .def("CreateObject", (GUILabel*(GUIManager::*)(GUILabel classType))&GUIManager::CreateObject<GUILabel>) 
     .def("CreateObject", (GUIImage*(GUIManager::*)(GUIImage classType))&GUIManager::CreateObject<GUIImage>) 

Alles funktioniert in Lua finden durch den Aufruf:

testLabel = theGUI:CreateObject(GUILabel()) 

aber ich fühle mich nicht "richtig" ist, wie Ich erstelle im Wesentlichen ein Objekt, das übergeben werden kann, ich bin mir sicher, dass es einen einfacheren Weg gibt, aber alle anderen Methoden, die ich bisher ausprobiert habe, stimmen weder mit dem Compiler noch mit Luabind überein. wenn nötig

Dank

+0

, wenn Sie einen Zeiger passieren würden Sie nicht Objekt Vorlage T * Create (T * classPtr) {return new T();} erstellen müssen ermöglicht: testLabel = theGUI: Create ((GUILabel *) NULL); und Vorlage void CreateObject (T * & KlassePtr) { classPtr = new T(); } für nur: theGUI: CreateObject (testLabel); – fantastory

+0

Wie würde ich Lua mitteilen, welches Objekt ich erstellen möchte? Soweit mir bekannt ist, würde ich mit dem gleichen Problem enden, das ich zuvor hatte, ohne zu wissen, welche der beiden gebundenen Funktionen zu verwenden und einen Fehler zu erzeugen. – OpticFroggy

Antwort

3

Fühlen Sie sich frei für weitere Informationen zu fragen

Da Ihr Luabind Bindungen werden mit expliziten Instanziierungen Ihrer CreateObject Methode können Sie jede Instanz einen anderen Namen binden:

class_<GUIManager>("GUIManager") 
     .def("CreateLabel", /*...*/&GUIManager::CreateObject<GUILabel>) 
     .def("CreateImage", /*...*/&GUIManager::CreateObject<GUIImage>) 

Dann könnte Ihr Lua-Code "vereinfacht" werden zu:

testLabel = theGUI:CreateLabel() 

Und Sie sollten keinen Parameter mehr in Ihrer Fabrikmethode benötigen.

class GUIManager { 
    template <class T> T * CreateObject() { return new T(); } 
}; 
+0

Perfekt! Vielen Dank für diese Antwort! – OpticFroggy

+0

@OpticFroggy: Gern geschehen. – jxh

Verwandte Themen