0

我想做这样的事情:
1. 在 Lua 中创建对象
2. 将这个对象传递给 C++
3. 对这个对象执行一些方法,从 C++ 传递它


现在我在 Lua 中有这个:

Account = {balance = 0}

function Account.Create(name)
    local a = Account:new(nil, name);
    return a;
end

function Account:new (o, name)
  o = o or {name=name}
  setmetatable(o, self)
  self.__index = self
  return o
end

function Account:Info ()
  return self.name;
end

C++ 中的代码

//get Lua object

lua_getglobal (L, "Account");
lua_pushstring(L, "Create");
lua_gettable(L, -2);
lua_pushstring(L, "SomeName");
lua_pcall(L, 1, 1, 0);
const void* pointer = lua_topointer(L, -1);
lua_pop(L, 3);

//then I want to perform some method on object

lua_getglobal (L, "Account");
lua_pushstring(L, "Info");
lua_gettable(L, -2);
lua_pushlightuserdata(L,(void*) pointer );
lua_pcall(L, 0, 1, 0);
//NOW I GET "attempt to index local 'self' (a userdata value)'
const char* str = lua_tostring(L, -1);
...etc...

你是不是我做错了什么?我怎样才能得到这个 Lua 对象到 C++ ?

4

1 回答 1

2
const void* pointer = lua_topointer(L, -1);

Lua 表不是 C 对象。他们不是void*s。lua_topointer文档说该功能主要用于调试目的。你没有调试任何东西。

Lua 表只能通过 Lua API 访问。您不能只获得指向 Lua 表或其他东西的指针。相反,您需要做的是将 Lua 表存储在一个位置,然后在您想要访问它时从该位置检索它。存储此类数据的典型位置是 Lua 注册表。Lua 代码无法访问它;只有 C-API 可以与之对话。

通常,您会在注册表中存储一些表,其中包含您当前持有的所有 Lua 值。这样,您对注册表的使用不会影响其他人对它的使用。

于 2012-05-29T21:11:41.657 回答