如何将对象从c ++传递给Lua并且相反?

时间:2015-10-19 10:03:35

标签: c++ lua

我有一个用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);

我需要做什么?

4 个答案:

答案 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接口时,你会找到一个完全符合你需求的教程。

编辑:这是我的谷歌搜索的屏幕截图。我们能得到多少荒谬?

screenshot of Google search for >lua c interface tutorial<