使用自制的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/