【发布时间】:2015-03-02 15:30:27
【问题描述】:
我对 Lua 还是很陌生,在 Lua 中注册 C 函数时,我很难找出最佳方法,但是从 C++ 类中,当涉及从对象中检索自指针时不是从 Lua 创建的。
考虑以下代码:
foo.h
class Foo
{
public:
static int lua_DoSomething(lua_State* pState);
void DoSomething();
};
foo.cpp
static const luaL_Reg methods[] =
{
{"DoSomething", Foo::lua_DoSomething},
{nullptr, nullptr}
};
extern "C"
{
int luaopen_Foo(lua_State* pState)
{
luaL_register(pState, "Foo", methods);
return 1;
}
}
int Foo::lua_DoSomething(lua_State* pState)
{
Foo* self = ???; //<-- how to get self pointer here?
self->DoSomething();
return 0;
}
void Foo::DoSomething()
{
//...
}
script.lua
Foo.DoSomething();
所以我的函数注册得很好,Foo::lua_DoSomething 被调用(耶!)。
但是,由于 Foo 对象不是从 Lua 创建的,我将如何在函数 Foo::lua_DoSomething 中获取 self 指针?
我是否必须向 Lua 注册某种 Foo::GetInstance 函数以获取 Foo 指针,然后以某种方式在 Lua 脚本中使用它?
如果有多个Foo 实例怎么办?
对于不是从 Lua 创建的对象,最简洁的通用方法是什么?
谢谢!
【问题讨论】:
-
你确定编译没有警告吗?无论如何,Lua 堆栈上的第一个参数将是它应该执行的对象。这可能是指您的
Foo,也可能不是。 -
@Deduplicator 当然
Foo* self = ???;行不会编译,它只是为了突出我需要帮助的位置。无论如何,如果对象不是由 Lua 创建的,Lua 堆栈如何包含我的 C++ 对象的指针? -
您说 lua 不会创建
Foo,但您仍然需要以某种方式获取Foo实例。您的 lua-C 绑定 API 设置目前如何做到这一点?米兰的回答可能是最有帮助的。 -
在你的情况下,我建议首先使用专用的包装器,例如 LuaBridge 或 LuaBind