自我指针,来自Lua的C ++函数

时间:2015-03-02 15:30:28

标签: c++ pointers lua self

我还是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被调用(是的!)。

但是,由于从Lua创建的Foo对象,我如何在函数Foo::lua_DoSomething中获取自指针?

我是否必须向Lua注册某种Foo::GetInstance函数,以获取Foo指针,然后以某种方式在Lua脚本中使用它?

如果有Foo的多个实例,该怎么办?

对于从Lua创建的对象,最简洁的一般方法是什么?

谢谢!

2 个答案:

答案 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;
}