2012-08-17 11 views
5

Estoy usando Luabind para exponer el motor de mi juego a Lua. Recientemente me encontré con problemas cuando descubrí que no hay forma de que cree un "nuevo", p. GUIObject * obj = new GUIObject() en Lua, en cambio todo lo creado dentro de Lua es propiedad de Lua.Método de plantilla C++ para crear objetos

Bueno, eso no fue un gran problema Decidí simplemente crear un tipo de patrón de fábrica en objetos para, p. Ej. Tiene mi GUIManager

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

Mis Luabind enlaces tener este aspecto:

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

Todo funciona encuentran en Lua llamando:

testLabel = theGUI:CreateObject(GUILabel()) 

Sin embargo siento que este no es "correcta", como Básicamente estoy creando un objeto para pasar, estoy seguro de que hay una manera más fácil, pero todos los demás métodos que he probado hasta el momento no concuerdan ni con el compilador ni con Luabind.

No dude en pedir más información si es necesario

Gracias

+0

si se pasa un puntero que no habría necesidad de crear el objeto plantilla T * CreateObject (T * classPtr) {return new T();} permite: testLabel = theGUI: CreateObject ((GUILabel *) NULL); y plantilla void CreateObject (T * & classPtr) { classPtr = new T(); } para just: theGUI: CreateObject (testLabel); – fantastory

+0

Utilizando ese método, ¿cómo podría informar a Lua qué objeto estoy intentando crear? por lo que yo sé, terminaría con el mismo problema que tuve antes sin saber cuál de las 2 funciones vinculadas usar y generar un error. – OpticFroggy

Respuesta

3

Desde sus enlaces Luabind están utilizando instanciaciones explícitas de su método de CreateObject, puede enlazar cada instancia de un nombre diferente:

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

Luego, su código Lua podría ser "simplificado" a:

testLabel = theGUI:CreateLabel() 

Y ya no necesita un parámetro en su método de fábrica.

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

¡Perfecto! Muchas gracias por esa respuesta! – OpticFroggy

+0

@OpticFroggy: eres bienvenido. – jxh

Cuestiones relacionadas