将 Lua 类对象存储为 C 指针并将其推回 Lua 堆栈

使用自制的 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 tClass;
end

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

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

此时,我不知道如何将此指针推回 Lua 堆栈,以便将 Lua 表推回堆栈,推送函数名称,然后调用它。

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

在 Lua 中:

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

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

编辑:

根据此 lua_topointer() 的描述,将 Lua 表转换为 C 指针仅供调试。谢谢。

点赞
用户5675002
用户5675002

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

2016-03-18 15:45:50