自指针,在 Lua 的 C++ 函数中
Self pointer, in C++ function from Lua
我对 Lua 还是很陌生,我很难找出在 Lua 中注册 C 函数时的最佳方法,但是从 C++ class ,当涉及到从 not 从 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 创建的,我将如何在函数 [=14= 中获取自指针]?
我是否必须向 Lua 注册某种 Foo::GetInstance
函数以获取 Foo
指针,然后以某种方式在 Lua 脚本中使用它?
如果 Foo
有多个实例怎么办?
对于从 Lua 创建的对象 而不是 ,最干净的通用方法是什么?
谢谢!
在Foo类型的成员函数中,'this'指针是自动提供给你的。它的类型是 const Foo*。通常不需要,因为在大多数情况下您可以直接使用该成员。例如:您可以替换:
int Foo::lua_DoSomething(lua_State* pState)
{
this->DoSomething();
return 0;
}
和
int Foo::lua_DoSomething(lua_State* pState)
{
DoSomething();
return 0;
}
你需要在lua状态传递一些信息,这将帮助你识别"self"。例如,您可以将所有创建的 Foo class 实例存储在映射中,将实例与某个标识符(int id)相关联,或者只是将实例的指针传递给 size_t。
然后在 lua_DoSomething 方法中,从 lua 状态获取该信息,将其转换为 Foo 实例,您将获得 "self".
post 编辑:
我从这方面对lua不是很熟悉(我在lua中编写了一些脚本)。但是...
在 lua 中,您可以存储数据,并且可以在 lua 和 C++ 之间交换这些数据。
我猜你在 lua 中有 C++ Foo 的对应部分,我们将其命名为 LFoo。
C++ 中的 Foo 有 DoSomething 方法,我想你想在 lua 中做同样的事情(我知道你不能在 lua 中有 classes 但有一些方法可以用 tables)。 Foo 实例有它的地址 (this)。将此地址传递给lua,并将值存储在LFoo 的table 中。当您在 lua 中调用 DoSomething 函数时,此函数将调用静态方法 lua_DoSomething,将 LFoo table 中的值通过 lua_state 传回该方法。用它来得到"this"。
尝试使用这样的东西:
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
我对 Lua 还是很陌生,我很难找出在 Lua 中注册 C 函数时的最佳方法,但是从 C++ class ,当涉及到从 not 从 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 创建的,我将如何在函数 [=14= 中获取自指针]?
我是否必须向 Lua 注册某种 Foo::GetInstance
函数以获取 Foo
指针,然后以某种方式在 Lua 脚本中使用它?
如果 Foo
有多个实例怎么办?
对于从 Lua 创建的对象 而不是 ,最干净的通用方法是什么?
谢谢!
在Foo类型的成员函数中,'this'指针是自动提供给你的。它的类型是 const Foo*。通常不需要,因为在大多数情况下您可以直接使用该成员。例如:您可以替换:
int Foo::lua_DoSomething(lua_State* pState)
{
this->DoSomething();
return 0;
}
和
int Foo::lua_DoSomething(lua_State* pState)
{
DoSomething();
return 0;
}
你需要在lua状态传递一些信息,这将帮助你识别"self"。例如,您可以将所有创建的 Foo class 实例存储在映射中,将实例与某个标识符(int id)相关联,或者只是将实例的指针传递给 size_t。 然后在 lua_DoSomething 方法中,从 lua 状态获取该信息,将其转换为 Foo 实例,您将获得 "self".
post 编辑:
我从这方面对lua不是很熟悉(我在lua中编写了一些脚本)。但是...
在 lua 中,您可以存储数据,并且可以在 lua 和 C++ 之间交换这些数据。
我猜你在 lua 中有 C++ Foo 的对应部分,我们将其命名为 LFoo。
C++ 中的 Foo 有 DoSomething 方法,我想你想在 lua 中做同样的事情(我知道你不能在 lua 中有 classes 但有一些方法可以用 tables)。 Foo 实例有它的地址 (this)。将此地址传递给lua,并将值存储在LFoo 的table 中。当您在 lua 中调用 DoSomething 函数时,此函数将调用静态方法 lua_DoSomething,将 LFoo table 中的值通过 lua_state 传回该方法。用它来得到"this"。
尝试使用这样的东西:
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