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

时间:2016-03-18 15:02:48

标签: c++ oop pointers 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 class object" )
    return tClass;
end

现在在C ++中我想得到它的实例并调用函数hello()。 在这里我尝试了:

  1. 调用getClass(),以便将Lua对象(表)推送到堆栈。
  2. 使用函数lua_topointer()将其地址存储到C ++ const void *中。
  3. 此时我不知道如何将此指针推回到Lua堆栈,因此将Lua表推回堆栈,按下函数名称然后调用它。

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

    在lua:

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

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

    修改:

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

    感谢。

1 个答案:

答案 0 :(得分:1)

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