将Lua类对象存储到C指针,并将其推送回Lua Stack

Store Lua class object to C pointer and push it back to Lua Stack

本文关键字:Lua Stack 指针 对象 存储      更新时间:2023-10-16

使用自制的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* 中。

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

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

在lua中:

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

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

编辑:

根据 lua_topointer() 的描述,将 Lua 表转换为 C 指针仅用于调试目的。

谢谢。

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