2012-08-17 7 views
5

Używam Luabind, aby odsłonić mój silnik gry Lua. Niedawno wpadłem w kłopoty, gdy dowiedziałem się, że nie ma sposobu, aby utworzyć "nowy", np. GUIObject * obj = new GUIObject() w Lua, zamiast wszystkiego wszystko, co powstało wewnątrz Lua, jest własnością Lua.Metoda szablonów C++ do tworzenia obiektów

Cóż, to nie była wielka sprawa. Postanowiłem po prostu stworzyć rodzaj wzoru Factory na obiektach np. moja GUIManager Has

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

My Luabind Wiązania wyglądać następująco:

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

Wszystko działa znaleźć w Lua przez wywołanie:

testLabel = theGUI:CreateObject(GUILabel()) 

Jednak czuję, że to nie jest "poprawny", jak Zasadniczo tworzę obiekt do przekazania, jestem pewien, że jest łatwiejszy sposób, ale wszystkie inne metody, które próbowałem do tej pory nie zgadzają się z kompilatorem lub Luabind.

Poczuj razie potrzeby

Dzięki

+0

jeśli będzie przekazać wskaźnik nie będzie trzeba utworzyć obiektu szablon T * CreateObject (T * classPtr) {return new T();} pozwala na: testLabel = theGUI: CreateObject ((GUILabel *) NULL); i szablon void CreateObject (T * i classPtr) { classPtr = new T(); } dla just: theGUI: CreateObject (testLabel); – fantastory

+0

Używając tej metody, pozwoliłbym Lui zorientować się, który obiekt próbuję utworzyć? O ile mi wiadomo, skończyłbym z tym samym problemem, który miałem wcześniej, nie wiedząc, która z 2 funkcji związanych do użycia i podnosząc błąd. – OpticFroggy

Odpowiedz

3

Od swoimi Luabind powiązania są za pomocą wyraźnych dawałaby swojej metodzie CreateObject można powiązać każdą instancję inną nazwą swobodnie pytać o więcej informacji:

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

Następnie Twój kod Lua może zostać "uproszczony" na:

testLabel = theGUI:CreateLabel() 

Nie powinieneś już potrzebować parametru w swojej fabrycznej metodzie.

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

Idealny! Wielkie dzięki za tę odpowiedź! – OpticFroggy

+0

@OpticFroggy: Proszę bardzo. – jxh

Powiązane problemy