【问题标题】:Luabridge: Returning C++ lifetime managed objectLuabridge:返回 C++ 生命周期托管对象
【发布时间】:2013-04-18 21:17:43
【问题描述】:

此片段适用于基本类型:

int CreateBasicObject(lua_State *L)
{
    int ret0;

    lua_pushinteger(L, ret0);

    return 1;
}

在 lua 中是这样的:

local NewObject=CreateBasicObject()

我将如何返回类而不是整数

push(L,&MyObject);
return 1;

似乎无法正常工作,lua 部分如下所示:

self.MyObject=Screen.MyObject(); 

错误是:

attempt to index field 'MyObject' (a number value)

【问题讨论】:

  • 您是专门询问 LuaBridge 还是普通 Lua?对于它的价值,我相信在尝试使用任何第三方绑定解决方案之前,应该尝试使用普通的 Lua C API 实现至少几个 C++ 类。这有助于更好地理解这些东西(LuaBridge 等构建的)是如何工作的。

标签: c++ binding lua luabridge


【解决方案1】:

newest LuaBridge 版本中,您可以使用RefCountedPtr 例如:

一些 C++ 定义

struct A {};

static RefCountedPtr<A> SomeA() {
 return RefCountedPtr<A>(new A);
}

和绑定:

luabridge::getGlobalNamespace(L)
  .beginClass<A>("A")
   .addConstructor< void (*) (), RefCountedPtr<A> >()
  .endClass()

  .addFunction("SomeA",&SomeA);

现在您可以安全地返回 A 对象并将它们作为 RefCountedPtr&lt;A&gt; 传递给其他 Lua 绑定函数

在 lua 中你可以这样使用它:

local a=A()
--do something with a...

local b=SomeA()
--do something with b...

【讨论】:

  • 你好 Dmitry,这是我们已经使用的,但希望 C++ 管理内存,因此不需要引用计数器指针。有什么方法可以在没有 RefCounterPtr 的情况下创建 C++ 生命周期托管对象?
  • 嗨,葡萄。你想如何将对象传递给 Lua?如果你想在 Lua 中创建它们,你必须使用 RefCountedPtr,如果没有,你可以将它们作为普通指针或引用传递,只是你应该注意你的 C++ 对象的生命周期超过潜在的生命周期来自 Lua 的引用。
  • 你好 Dmitry,我想调用 CreateBasicObject() 并让它返回一个原始 C++ 指针,如果没有 RefCounterPtr,lua 不会对它进行垃圾收集。这可能吗?
  • 它不会被垃圾回收,除非在 C++ 中对该对象的最后一个引用被销毁。我想,这正是你所需要的。例如,如果您将该引用作为返回值或输入参数输出到您的 C++ 代码中。请阅读documentation共享生命周期部分。 LuaBridge 的目的之一是将 C++ 程序员从 C++ 和 Lua 边界的生命周期管理问题中解放出来。只是不要处理原始指针,使用 RefCounterPtr,它不会被意外收集​​垃圾:)。
  • 您好 Dmitry,我们已经在整个程序中使用了 RefCountedObjectPtr,但是对于一些变量,我们希望 C++ 能够控制对象的生命周期。 github.com/vinniefalco/LuaBridge/#c-lifetime 但作为函数中的返回值(如 CreateBasicObject)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2012-12-28
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多