自指针,在 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