【问题标题】:Store Lua class object to C pointer and push it back to Lua Stack将 Lua 类对象存储到 C 指针并将其推回 Lua Stack
【发布时间】:2016-07-05 09:43:51
【问题描述】:

使用自制的 Lua C++ 绑定,我能够创建可从 Lua 脚本获得的 C++ 类。

现在我想在 Lua 脚本中创建类对象,将其引用存储在 C++ 中,并在需要时从 C++ 代码中调用此 Lua 类对象的函数。

在 Lua 脚本中,我创建了一个带有全局函数的类对象,以将其传递给 C++ 代码。

MyClass = {}

function MyClass:hello()
    debug.codeSite.sendMsg( "MyClass:hello()" )
end

function MyClass:new()
  local tNewClass = {}

  setmetatable( tNewClass, self )
  self.__index = self

  return tNewClass
end

local tClass = MyClass:new()

function getClass()
    debug.codeSite.sendMsg( "Return class object" )
    return tClass;
end

现在在 C++ 中,我想获取它的实例并调用函数 hello()。 这是我尝试过的:

  1. 调用 getClass() 将 Lua 对象(一个表)推入堆栈。
  2. 使用函数 lua_topointer() 将其地址存储到 C++ const void* 中。

此时不知道怎么把这个指针push回lua栈,所以把lua表push回栈,push函数名再调用。

所有这些的想法是在 Lua 脚本中创建多个对象并在 C++ 中使用它们。

在 lua 中:

tObject1 = MyClass:new()
tObject2 = MyClass:new()

在 C++ 中,需要时使用 tObject1:hello() 或 tObject2:hello()。

编辑:

根据这个description of lua_topointer(),将Lua表转换为C指针仅用于调试目的。

谢谢。

【问题讨论】:

    标签: c++ oop pointers lua


    【解决方案1】:

    使用 luaL_ref() 将 lua 对象存储在预定义的 Lua 注册表中,并将返回的整数索引保存在 c++ 中。当您需要将 Lua 对象放入 Lua 堆栈时,使用 lua_rawgeti() 从注册表中读取它,使用之前检索到的索引。 当你不再需要 c++ 端的对象时,不要忘记使用 luaL_unref() 取消引用它。

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 2012-11-08
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      相关资源
      最近更新 更多