2012-08-17 6 views
5

Uso Luabind per esporre il mio motore di gioco a Lua. Recentemente ho avuto problemi quando ho scoperto che non c'è modo per me di creare un "nuovo", ad es. GUIObject * obj = new GUIObject() in Lua, invece tutto ciò che è stato creato all'interno di Lua è di proprietà di Lua.Metodo template C++ per creare oggetti

Beh, non è stato un grosso problema, ho deciso di creare una sorta di modello di fabbrica sugli oggetti per es. il mio GUIManager ha

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

miei Luabind Associazioni simile a questa:

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

Tutto funziona trovano in Lua chiamando:

testLabel = theGUI:CreateObject(GUILabel()) 

Tuttavia sento che questo non è "corretta", come Essenzialmente sto creando un oggetto da passare, sono sicuro che c'è un modo più semplice ma tutti gli altri metodi che ho provato fino ad ora non concordano con il compilatore o con Luabind.

Sentitevi liberi di domanda per ulteriori informazioni, se necessario

Grazie

+0

se si passa un puntatore che non avrebbe bisogno di creare l'oggetto modello T * CreateObject (T * classPtr) {return new T();} permette di: testLabel = theGUI: CreateObject ((GUILabel *) NULL); e modello void CreateObject (T * & classPtr) { classPtr = new T(); } per just: theGUI: CreateObject (testLabel); – fantastory

+0

Usando questo metodo, come faccio a far sapere a Lua quale oggetto sto cercando di creare? per quanto ne so, mi ritroverei con lo stesso problema che avevo in precedenza, non sapendo quale delle 2 funzioni associate usare e generare un errore. – OpticFroggy

risposta

3

Dal momento che i Luabind Associazioni utilizzano istanze esplicite del vostro metodo di CreateObject, è possibile associare ogni istanza di un nome diverso:

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

Quindi, il codice Lua potrebbe essere "semplificato" a:

testLabel = theGUI:CreateLabel() 

E non dovresti più aver bisogno di un parametro nel tuo metodo di fabbrica.

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

Perfetto! Grazie mille per quella risposta! – OpticFroggy

+0

@OpticFroggy: sei il benvenuto. – jxh