【问题标题】:Passing non-Global C++ objects to Lua functions (Swig)将非全局 C++ 对象传递给 Lua 函数 (Swig)
【发布时间】:2010-03-07 07:22:32
【问题描述】:

我正在使用 lua 扩展一个接口,我遇到了一个问题,即我需要将指向对象的指针传递给 lua 代码来处理。这些类将通过 SWIG 包装,我可以使用 swig 通过 lua 实例化它们,但这会给我留下无用的对象。

我需要能够将回调对象以及表示事件的对象传递给 lua。我不能手动将回调定义为全局,因为这会引入一个不可接受的约束。

所以对于一个通用的例子,给定一个 C 类和一个在 lua 中接受 1 个参数的函数,我如何调用该 lua 函数,同时将 C 类型的 C++ 指针传递给它?

【问题讨论】:

    标签: c++ lua swig


    【解决方案1】:

    啊哈,回答我自己的问题,但我找到了!

    http://lua-users.org/lists/lua-l/2007-05/msg00053.html

    你好乔伊,

    我几乎所有的 SWIG-LUA 工作都是从 lua 方面。 Swig 真的很适合 只是包装一个 C/C++ 库 让它被 lua 读取。获取 C++ 与 lua 对话相当容易,但是 没有很好的记录。

    你的想法lua_pushlightuserdata(), 很近,但不在那里。你可能 想要这样的东西:

    Foo* p= new Foo();
    SWIG_NewPointerObj(L,p,SWIGTYPE_p_Foo,1);
    lua_setglobal (L, "p");
    

    SWIG_NewPointerObj() 创建一个 用户数据(不是 lightuserdata) foo 对象 & 将其推入堆栈。 最后一个参数(在本例中为 1)是 是否要 lua 管理 内存(0 表示否,1 表示是)。

    SWIG_NewPointerObj()SWIGTYPE_p_Foo 都在 包装文件。

    一旦你拥有了,你应该能够 在lua中做:

    print(p)
    print(swig_type(p))
    p:some_function()
    

    如果你还有其他的,请告诉我 问题。问候,马克

    【讨论】:

      【解决方案2】:

      我没有将 Swig 与 C++ 和 Lua 一起使用,但是您可以通过两种不同的方式(用户数据和闭包)在没有 Swig 的情况下使用它。我不知道 Swig 是否会以某种方式干扰这一点。

      Using Userdata

      lua_pushcclosure

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-23
        • 2017-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        • 2014-09-26
        • 2015-08-30
        相关资源
        最近更新 更多