我有一个用c ++创建的对象,我想将它传递给Lua,在Lua中我需要获取该对象并传递给c ++。
在c ++中:
class Measure
{
public:
Measure();
private:
int value;
}
Void PassObjToLua(lua_State *L)
{
Measure * m=new Measure(); // I need to pass this object to Lua
// How to implement?
}
Void GetObjFromLua(lua_State *L)
{
//I need to get Measure object from Lua. How to implement?
}
在Lua脚本中。
Local measure=nil;
measure= PassObjToLua();
GetObjFromLua(measure);
我需要做什么?
答案 0 :(得分:1)
正如Marcus所写,您需要以某种方式使用Lua C API。为此,您可以使用C代码生成器或Lua包装器。你可以在lua wiki site上找到这两个例子,以及如何编写自己的Lua包装器的说明。
编辑:稍微扩展我的答案。您需要将C ++类类型实例表示为lua类型实例。最受欢迎的两个选项是:将C ++对象表示为lua表,或者将lua userdata表示为附加了元表。如果您选择使用lua表,则可以选择使用键填充表,映射到CFunction
,或者像使用userdata一样使用metatable。 metatable允许您挂钩表/用户值键访问并在C ++中处理它们。
答案 1 :(得分:1)
我所知道的最好的方法是Sol库,它公开了一个C ++接口。
Its userdata example显示了如何使用库创建链接到C ++对象的表。
这个答案可能看起来像是仅链接,但你真的需要看看图书馆有多复杂,才能意识到这个问题真的无法解决回答一个简单的答案。关于使用C API并将其包装在C ++原语中,有许多注意事项。
我个人不喜欢基于宏观的反射式粘合剂,并建议不要使用其中一个,当然其他人可能会有不同的意见。
答案 2 :(得分:0)
您可以使用Lua的轻量级用户数据来执行此操作。在这种情况下,对象由C ++管理:
extern "C" int PassObjToLua(lua_State *L)
{
Measure * m=new Measure(); // I need to pass this object to Lua
lua_pushlightuserdata (L, m);
return 1;
}
extern "C" int GetObjFromLua(lua_State *L)
{
Measure *m = (Measure*)lua_touserdata (L, 1);
return 0;
}
在Lua上下文中注册C函数:
lua_pushcfunction (L, GetObjFromLua);
lua_setglobal (L, "GetObjFromLua");
lua_pushcfunction (L, PassObjToLua);
lua_setglobal (L, "PassObjToLua");
答案 3 :(得分:-3)
Lualib有一个C接口,而不是C ++接口 - 所以不用多说,你必须生成可以与Lua一起使用的extern C
函数。
这里的地方太短了,无法全面介绍如何使用lua使用C ++,或者如何使用Lua扩展C程序。我认为可以肯定地说,当你使用google与 lua C接口时,你会找到一个完全符合你需求的教程。
编辑:这是我的谷歌搜索的屏幕截图。我们能得到多少荒谬?