4

我有 C++ 对象和Lua对象/表。(也有SWIG C++ 绑定。)

我需要做的是关联这两个对象,这样如果我说

CObject* o1 = getObject();
o1->Update();

它将执行等效的 Lua:

myluatable1.Update();

到目前为止,我可以想象 CObject::Update 将具有以下代码:

void CObject::Update(){
    // Acquire table.

    // ???

    // Do the following operations on the table.
    lua_getfield(L, -1, "Update");
    lua_pcall(L, 0, 0, 0);
}

我将如何存储/设置要使用的 Lua 表,以及 // ???上面的内容如何使 Update 调用工作?

4

2 回答 2

17

我不敢相信没有人注意到这一点!

http://www.lua.org/pil/27.3.2.html

Lua API 的一部分,用于存储对 lua 对象和表的引用并返回引用以存储在 C 结构中!

于 2010-01-13T15:11:09.203 回答
2

我很好奇这种“反向 SWIG”的原因......

Lua 中的对象存在于 Lua 上下文中,因此您至少需要在对象中存储“L”。

传递“表指针”的问题有点微妙——即使 Lua 允许从 Lua 堆栈中检索指针(使用 lua_topointer()),也无法将其放回去。理解 - 因为否则还需要检查指针是否指向有效对象等。

但是,您可能会做的是将对表的引用存储在全局表中,索引是 lightuserdata,是指向您的对象的指针。然后通过获得 Lua 状态和全局数组的名称,您可以检索对表的引用并将其推送到该上下文的 Lua 堆栈中。

这是粗略的,我什至还没有触及这个构造的垃圾收集问题。

但无论如何,这不会是速度赛车的性能方面,而且对我来说看起来像是很多样板 C++ 代码。我会尝试重新考虑这种方法,并将您想做的一些事情推到 Lua 域中。

ps 看起来这是第三个问题,似乎几乎是前两个问题的欺骗,这里这里是以前的问题。如果没有完全回答这些问题,最好编辑它们/添加赏金来积累答案。

于 2009-12-29T13:30:55.807 回答