Lua C++ userdata:用户数据类型,可以由C++代码创建并绑定到Lua变量中。它的值可以是任何C++对象或结构体的指针,允许Lua脚本与C++代码之间交换数据和调用C++接口。

我正在尝试访问userdata的类型,以便我可以相应地处理它。假设我有一个名为Foo的类:

class Foo : public CObject
{
public:
    Foo() : CObject() {}
    int type() { return 1; }
}

class CObject
{
public:
    virtual int type(void) = 0;
}

原理是,每个扩展CObject的类都有一个类型,必须通过整数号(稍后为枚举)来确定。使用luaWwrapper将Foo类绑定到lua(//https://bitbucket.org/alexames/luawrapper/src/fd9c4fdbf4b25034e3b8475a2c8da66b7caab427?at=default )。

Foo * foo_new(lua_State * L)
{
    Foo * f = new Foo();
    lua_newuserdata(L, sizeof(f));
    std :: cout << "f =" << f;
    返回f;
}

在Lua中,用户将其调用为:

f = Foo.new()
print(f)

现在我有一个C ++函数,比如print:

int lua_print(lua_State * L)
{
    void * ud = luaL_checkudata(L,1,“Foo”); //ud不为零
    std :: cout <<“ud =”<< ud;
    CObject * obj =(CObject *)ud; //转换为CObject
    int objtype = obj->type(); //程序在此处崩溃

}

我发现程序崩溃是因为“Foo”和“ud”的内存地址不同。我_认为_“ud”是指堆栈内存,其中包含“Foo”的内存地址。如何访问堆栈的内存地址或“Foo”的首选内存地址?

点赞
用户4447998
用户4447998

你需要使用定位 new 来初始化对象 _在 lua_newuserdata 返回的内存中_。

大致如下:

void *ud = lua_newuserdata(L,sizeof(Foo));
new (ud) Foo();
2015-06-22 01:48:34
用户63791
用户63791

Foo_new 应该只返回对象的指针。

换句话说,你的 Foo_new 应该像这样:

Foo* Foo_new(lua_State* L)
{
  return new Foo();
}

然而,如果你没有需要特殊初始化的操作,你甚至不需要编写这个函数。如果你没有自己编写函数,神奇的模板会自动为你提供这个函数。

当你想从 Lua 状态获取你的 Foo 对象时,你可以这样做:

int lua_print(lua_State* L)
{
   Foo *ud = luaW_to<Foo>(L, 1); //ud is not zero
   std::cout<<"ud="<<ud;
   CObject* obj=(CObject*)ud;
   int objtype=obj->type();
}

如果 CObject 也已经与 LuaWrapper 注册了,你甚至不需要手动转换类型。你只需这样做:luaW_to<CObject>(L, 1);

2015-07-09 23:20:13