我不确定我的问题是否有意义,但我当然知道从谷歌获得结果几乎是不可能的。首先,我做什么not想。我不想调用一些打印“hello world”或将两个数字相加的函数,我想从 C++ 程序加载 Lua 脚本,但允许脚本使用函数修改 C++ 程序的变量。例如,假设我有一个这样的 C++ 程序:
class Foo
{
private:
int number = 0;
public:
void setNumber(const int& newNumber) {number = newNumber;}
}
int main()
{
Foo foo;
//Load and execute Lua script, with foo object
return 0;
}
我怎样才能让Lua脚本做foo.setNumber()
(最好没有foo.
)?这可能是一个很简单的问题,但是正如上面提到的,Google 上几乎所有的信息当搜索“从 Lua 调用 C++ 函数”时假设没有程序,只有一个 .cpp/hpp 文件,其中包含您要调用的一些函数。
我使用的是 Linux (Ubuntu),但该程序需要在所有平台(Windows 和 Mac)上编译
这里经常有人问这个问题。
要滚动您自己的绑定,您应该:
- 完全掌握 Lua 元表。
- 阅读Lua 编程有关 C API 的内容,特别是有关类的部分。或者,您可以阅读手册、阅读源代码(尤其是 API 标头)并进行一些谷歌搜索,但这本书可能会节省您一些时间。
概括地说,您可以通过创建包含指向类实例的指针的 Lua“用户数据”并将其传递给 Lua 脚本来向 Lua 公开 C++ 类实例。 userdata 是一种不透明类型; Lua 脚本实际上不能用它做任何事情(除了传递它),除非你给它一个元表。至少你必须实施__index
用户数据上的元方法,它允许您的 C++ 代码拦截对用户数据进行索引的尝试并返回有意义的内容,并且__gc
元方法,它允许您的 C++ 代码在相应的 Lua 用户数据被垃圾收集时删除公开的 C++ 对象。
例如,您创建一个名为的函数createFoo
这创建了一个Foo
实例,将指针包装为用户数据,应用元表实现__index
并将其返回给 Lua 脚本。
当用户运行时foo.setNumber
,你的C++__index
使用用户数据和字符串“setNumber”调用元方法。返回什么由您决定,这决定了什么foo.setNumber
在 Lua 脚本中求值为 。你要foo.setNumber
评估为lua_CFunction
它期望一个Foo
userdata 作为它的第一个参数,这样你的类方法就可以从 Lua 中惯用地调用(即foo:setNumber(12)
,这是语法糖foo.setNumber(foo, 12)
).
这是一个非常低级别的手动过程,一旦您掌握了它,您最终将创建一个库/模板/宏来为您做样板。那时您可能想要评估无数C++ 绑定库存在的。然而,感谢抽象泄漏定律首先学习手动执行此操作是一个非常好的主意。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)