2012-08-17 2 views
5

Я использую Luabind, чтобы выставить свой игровой движок Lua. Недавно я столкнулся с трудностями, когда узнал, что у меня нет возможности создать «новый», например. GUIObject * obj = new GUIObject() в Lua, а все, что создано в Lua, принадлежит Lua.Метод шаблона C++ для создания объектов

Ну, это не была огромная проблема. Я решил просто создать своего рода шаблон Factory на объектах, например. мой GUIManager Имеет

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

Мои Luabind Наручники выглядеть следующим образом:

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

Все работает найти в Lua по телефону:

testLabel = theGUI:CreateObject(GUILabel()) 

Однако я считаю, что это не "правильный", как Я по существу создаю объект для передачи, я уверен, что есть более простой способ, но все другие методы, которые я пробовал до сих пор, не согласуются ни с компилятором, ни с Luabind.

Вы можете запросить дополнительную информацию, если это необходимо

Благодаря

+0

если вы передаете указатель не нужно будет создавать объект шаблон T * CreateObject (T * classPtr) {возвратить новый T();} позволяет: testLabel = theGUI: CreateObject ((GUILabel *) NULL); и template void CreateObject (T * & classPtr) { classPtr = new T(); } для просто: theGUI: CreateObject (testLabel); – fantastory

+0

Используя этот метод, как я могу позволить Lua узнать, какой объект я пытаюсь создать? насколько мне известно, я получаю ту же проблему, что и раньше, не зная, какую из 2 связанных функций использовать и поднимать ошибку. – OpticFroggy

ответ

3

Поскольку ваши Luabind переплетов используют явные экземпляры вашего метода CreateObject, вы можете связать каждый экземпляр с другим именем:

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

Затем ваш код Lua может быть «упрощен» до:

testLabel = theGUI:CreateLabel() 

И вам больше не нужен параметр в вашем заводском методе.

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

Отлично! Большое спасибо за этот ответ! – OpticFroggy

+0

@OpticFroggy: Вы очень желанны. – jxh

Смежные вопросы