我目前正在开发一个基于插件的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'的子类型而不是特定的子类型。我不确定这是否甚至是必要的,但它确实有效,随后可以从'a_name'下的Lua访问创建的对象。
我遇到的问题是,无法使用派生类中定义的函数,这些函数在父类中根本没有声明。在基类中定义的虚函数(例如上面的'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无法再确定对象的派生类型。我确信我做错了,可能与我的系统架构所需的两步绑定有关,但我无法弄清楚在哪里。我非常感谢一些帮助=)