C++类和Lua

我希望有一些 C++ 对象,可以在 C++ 和 Lua 中读取/写入。

我已经查看了:http://www.lua.org/pil/28.html

但是,我不喜欢那个解决方案,因为我的对象具有构造函数和析构函数(它们很重要,因为我使用 RAII,这些函数负责引用计数)。

在 PIL 解决方案中,我不喜欢的是对象分配在 Lua 的堆中。

相反,我希望自己创建 C++ 对象,然后让 Lua 有一种方式来对它们进行 get/set 操作。

有人有一个好的教程/链接吗?

谢谢!

原文链接 https://stackoverflow.com/questions/2785043

点赞
stackoverflow用户65845
stackoverflow用户65845

似乎使用工厂模式是个好主意?例如,不仅通过 Lua 中的“标准”方法动态创建对象,而是可以调用 Create 和 Destroy 函数来创建和销毁对象。

2010-05-06 22:51:45
stackoverflow用户41661
stackoverflow用户41661

一种选择是使用_light_ userdata,它允许您在C++堆上分配对象。请参阅 lua_pushlightuserdata 的文档。不幸的是,light userdata 没有元表。即使您愿意使用Lua 函数 进行get / set来访问它,您仍然需要执行以下操作:

static int myget(lua_State *L) {
   myclass thing = lua_touserdata(L, 1);
   lua_pushnumber(thing::getsize());
   return 1;
}

不幸的是,由于它是light userdata,没有真正的方法使此操作具有类型安全性--所有的light userdata都被视为相同的,也没有元表。

更好的解决方案是在Lua堆上分配一个完整的userdata,其中包含指向在C++堆上分配的对象的单个指针,并具有适当的元表。然后,您可以遵循_Programming in Lua_中的模型。例如,您可以查看Lua io库来了解如何处理 FILE *。这样,您就可以使用luaL_checkudata函数编写C接口,并且它们将是安全的,但是您仍然可以在C++堆上分配您的对象,而不是在Lua堆上分配它们。

2010-05-07 01:03:10
stackoverflow用户6236
stackoverflow用户6236

使用放置新对象。详见此处中的方便模板:

template< typename T >
void my_newuserdata( lua_State * L ) {
   new ( reinterpret_cast< T * >( lua_newuserdata( L, sizeof( T ) ) ) ) T();
}

template< typename T >
int my_gc( lua_State * l ) {
   reinterpret_cast< T * >( lua_touserdata( L, 1 ) )->~T();
   return 0;
}

(未经测试,请参见上面的链接以获取更多细节。)

2010-05-07 01:55:58
stackoverflow用户155143
stackoverflow用户155143

我好像记得有个同事搞过这种事情,Lua 和 C++ 对象都是一等公民,在两个方向上完全可操作。

如果我没记错的话,这是基于 Lua++ 的,但是现在我不确定,抱歉。

2010-05-07 01:59:12