Luabind: производный класс как параметр

Недавно я изучил Luabind с намерением интегрировать его в наше программное обеспечение. Я столкнулся с парой проблем, и я просматривал документацию по Rasterbar Software от Luabind и не смог ее решить. По сути, я предоставляю функцию, которая принимает строку и абстрактный базовый класс в качестве параметров. Во-первых, я не уверен, что делаю это правильно, или, возможно, в lua требуется какая-то особая обработка, чтобы это работало. В любом случае, вот код

class UIFactory
{
    void addComponentFactory(std::string name, BaseFactory* factory);
}

BaseFactory — это абстрактный базовый класс, который возвращает UIComponent (кнопку, текст и т. д.), и у нас есть производная фабрика с именем TemplateFactory, которая в основном может быть создана следующим образом.

TemplateFactory<Button> buttonFactory = new TemplateFactory<Button>();

Затем мы передавали бы их в UIFactory на С++ вот так...

uiFactory.addComponentFactory("Buttons", buttonFactory);

в луабинде...

module(state)
[
    class_<UIFactory>("UIFactory")
    .def(constructor<>())
    .def("AddFactory", &UIFactory::addComponentFactory)
];

а на луа...

uiFactory = UIFactory()

buttonFactory = ButtonFactory()

uiFactory:AddFactory("Button", buttonFactory)

Эта последняя строка не выполняется, я проверил, что фабрика кнопок и фабрика пользовательского интерфейса были созданы, и они были созданы. Есть ли что-то, что я упускаю?

Помощь приветствуется.


person rocklobster    schedule 09.04.2012    source источник
comment
Что вы имеете в виду под не выполняется? Вы имеете в виду, что сценарий Lua выдает ошибку, или что ваша функция не вызывается, или что? Вы проверили (скажем, print утверждениями), что Lua зашел так далеко?   -  person Nicol Bolas    schedule 09.04.2012
comment
Я проверил, что предыдущий оператор buttonFactory = ButtonFactory() работает, поэтому он должен работать до этого момента. Я новичок в lua и luabind, поэтому я не совсем уверен, как заставить функцию печати lua работать, если она не запущена через интерпретатор.   -  person rocklobster    schedule 09.04.2012


Ответы (1)


Оказывается, мне нужно было предоставить базовый класс для lua, а также указать, что buttonFactory был производным

luabind::module(state)
[
    luabind::class_<BaseFactory>("BaseFactory")
];

luabind::module(state)
[ 
    luabind::class<TemplateFactory<Button>, BaseFactory>("ButtonFactory")
    .def(constructor<>())
]
person rocklobster    schedule 10.04.2012