使用自制的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()。
这是我尝试的:


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


在这一点上,我不知道如何将这个指针回推到Lua堆栈,因此Lua表被推回了堆栈,压入了函数名,然后调用了它。

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

在lua中:

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


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

编辑:

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

谢谢。

最佳答案

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

关于c++ - 将Lua类对象存储到C指针,并将其推回Lua Stack,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36087730/

10-11 22:31
查看更多