将Lua类对象存储到C指针,并将其推送回Lua Stack
Store Lua class object to C pointer and push it back to Lua Stack
使用自制的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()。
编辑:
根据 lua_topointer() 的描述,将 Lua 表转换为 C 指针仅用于调试目的。
谢谢。
使用 luaL_ref() 将 lua 对象存储在预定义的 Lua 注册表表中,并将返回的整数索引保存在 c++ 中。当你需要将 Lua 对象放在 Lua 堆栈上时,使用 lua_rawgeti() 从注册表中读取它,使用之前检索的索引。不要忘记在 c++ 端不再需要 luaL_unref() 时取消引用对象。
相关文章:
- C++Lua用户数据扰乱了Mathfu浮点值
- 使用 LuaBridge 或 Lua 将对象传递给 Lua 函数C++
- std::stack 是连续的吗?
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- 将 Lua 函数块转换为 C 字符串
- 我可以从 lua 5.0.2 加载用 c++ 编写的 lua 5.3.5 dll 吗?
- 使用 lua 协程 API 和lua_close时出现分段错误
- 使用 C++ 自动 Lua 绑定
- 调用 lua 函数的地址为 C/C++?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- Incomings Call with Android Sip stack in Embarcadero C++ bui
- 堆叠协程 + gdb = "previous frame inner to this frame (corrupt stack)?"
- 如何将 Lua 添加到C++项目
- 生成质数的程序,错误:"Stack overflow"
- 使用 Lua 中的C++库对象
- 如何在C++中将用户数据从一个 Lua 块传递到另一个块
- 如何在 x64 上"stack oveflow"例外
- 为什么此代码中显示"*** stack smashing detected ***: <unknown> terminated Aborted (core dumped) "错误?
- 如何使用重新定义的打印函数打印Lua表?
- 将Lua类对象存储到C指针,并将其推送回Lua Stack