我还是Lua的新手,我很难在Lua中注册C函数时想出最好的方法,但是从C ++类中,当从一个对象中检索自我指针时从Lua创建不。
请考虑以下代码:
class Foo
{
public:
static int lua_DoSomething(lua_State* pState);
void DoSomething();
};
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()
{
//...
}
Foo.DoSomething();
所以我注册的函数很好,Foo::lua_DoSomething
被调用(是的!)。
但是,由于从Lua创建的Foo
对象不,我如何在函数Foo::lua_DoSomething
中获取自指针?
我是否必须向Lua注册某种Foo::GetInstance
函数,以获取Foo
指针,然后以某种方式在Lua脚本中使用它?
如果有Foo
的多个实例,该怎么办?
对于从Lua创建的不对象,最简洁的一般方法是什么?
谢谢!
答案 0 :(得分:0)
你需要在lua状态下传递一些信息,这将帮助你识别“自我”。例如,您可以将所有创建的Foo类实例存储在map中,将实例与某个标识符(int id)相关联,或者只是将实例的指针传递给size_t。 然后在lua_DoSomething方法中,从lua状态获取该信息,将其转换为Foo实例,并且您具有“self”。
帖子编辑:
我对这方面的lua不太熟悉(我在lua中做了一些脚本)。但是......
在lua中,您可以存储数据,您可以在lua和C ++之间交换这些数据。
我想你在lua中反对C ++ Foo的一部分,让我们把它命名为LFoo
C ++中的Foo有DoSomething方法,我想你想在lua中做同样的事情(我知道你不能在lua中有类,但是有办法用表来模仿它)。 Foo实例有它的地址(这个)。将此地址传递给lua并将值存储在LFoo的表中。当您在lua中调用DoSomething函数时,此函数将调用静态方法lua_DoSomething,将LFoo表中的值通过lua_state传递回该方法。用它来得到“这个”。
尝试使用以下内容:
void RegisterFoo(lua_state* pState, Foo* foo)
{
Foo** p = (Foo**)lua_newuserdata(pState,sizeof(foo));
*p = foo;
...
}
int Foo::lua_DoSomething(lua_State* pState)
{
// pass the pointer at first index for example
Foo* self = (Foo*)lua_topointer(pState,0);
self->DoSomething();
return 0;
}
我找到了这些功能的解释:
http://pgl.yoyo.org/luai/i/lua_newuserdata
http://pgl.yoyo.org/luai/i/lua_topointer
答案 1 :(得分:-2)
在Foo类型的成员函数中,&#39; this&#39;指针是自动提供的。它的类型是const Foo *。通常不需要,因为在大多数情况下,您可以直接使用该成员。例如:您可以替换:
int Foo::lua_DoSomething(lua_State* pState)
{
this->DoSomething();
return 0;
}
带
int Foo::lua_DoSomething(lua_State* pState)
{
DoSomething();
return 0;
}