В настоящее время я разрабатываю систему на основе плагинов на 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 неожиданно больше не может определить производный тип объекта. Я уверен, что делаю что-то не так, возможно, из-за двухэтапного связывания, требуемого моей архитектурой системы, но я не могу понять, где. Я был бы очень признателен за помощь =)