Функции связывания производного класса с luabind - PullRequest
6 голосов
/ 25 марта 2010

В настоящее время я разрабатываю систему на основе плагинов на C ++, которая предоставляет интерфейс сценариев Lua, для которого я решил использовать luabind. Я использую Lua 5 и luabind 0.9, статически связанные и скомпилированные с MSVC ++ 8. Теперь у меня возникают проблемы с привязкой функций с luabind, когда они определены в производном классе, но не в его родительском классе.

Более конкретно, у меня есть абстрактный базовый класс под названием «IPlugin», от которого наследуются все классы плагинов. Когда менеджер плагинов инициализируется, он регистрирует этот класс и его функции следующим образом:

luabind::open(L);
luabind::module(L) [
    luabind::class_<IPlugin>("IPlugin")
    .def("start", &IPlugin::start)
];

Поскольку во время выполнения известно только то, какие эффективные классы плагинов доступны, мне приходилось решать загрузку плагинов каким-то окольным путем. Менеджер плагинов предоставляет Lua заводскую функцию, которая принимает имя класса плагина и имя нужного объекта. Затем фабрика создает объект, регистрирует класс плагина как унаследованный от базового класса «IPlugin», и немедленно вызывает функцию созданного объекта, которая регистрируется как глобальная с состоянием Lua, например:

void PluginExample::registerLuaObject(lua_State *L, string a_name)
{
    luabind::globals(L)[a_name] = (PluginExample*)this;
}

Первоначально я сделал это, потому что у меня были проблемы с определением Lua наиболее производного класса объекта, так как если я регистрирую его в менеджере плагинов, он известен только как подтип 'IPlugin', а не как конкретный подтип. Я больше не уверен, если это даже необходимо, хотя, но это работает, и созданный объект впоследствии доступен из Lua под 'a_name'.

Однако у меня проблема в том, что функции, определенные в производном классе, которые вообще не были объявлены в родительском классе, использовать нельзя. Виртуальные функции, определенные в базовом классе, такие как start выше, работают нормально, и вызов их из Lua для нового объекта запускает соответствующий переопределенный код из класса PluginExample. Но если я добавлю новую функцию в PluginExample, то вот, например, функция, не имеющая аргументов и возвращающая void, и зарегистрирующая ее так:

luabind::module(L) [
luabind::class_<PluginExample, IPlugin>("PluginExample")
    .def(luabind::constructor<PluginManager&>())
    .def("func", &PluginExample::func)
];

вызов 'func' для нового объекта приводит к следующей ошибке во время выполнения Lua:

No matching overload found, candidates:
void func(PluginExample&)

Я правильно использую синтаксис ':', поэтому аргумент 'self' не нужен, и кажется, что Lua неожиданно больше не может определить производный тип объекта. Я уверен, что делаю что-то не так, возможно, из-за двухэтапного связывания, требуемого моей архитектурой системы, но я не могу понять, где. Я был бы очень признателен за помощь =)

...