c ++课程& LUA

时间:2010-05-06 22:50:29

标签: c++ lua

我想拥有可以在C ++和C ++中读/写的C ++对象。 LUA。

我看过:http://www.lua.org/pil/28.html

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

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

我想要的是自己创建hte C ++对象,并让lua有办法获取/设置它们。

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

坦克!

4 个答案:

答案 0 :(得分:6)

一种选择是使用 light userdata,它允许您在C ++堆上分配对象。请参阅lua_pushlightuserdata的文档。不幸的是,轻的用户数据没有元数据。即使您愿意使用Lua 函数来访问它来获取/设置,您仍然必须执行以下操作:

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

不幸的是,因为它是一个轻量级用户数据,所以没有真正的方法可以使这种操作类型安全 - 所有轻度用户数据都被视为相同,并且它们没有元数据。

更好的解决方案是在Lua堆上分配一个完整的用户数据,使用适当的元表,其内容是单个指针到C ++堆上分配的对象。然后,您可以按照 Lua中的编程中的模型进行操作。例如,您可以查看Lua io库以了解如何处理FILE *。这样你就可以使用luaL_checkudata函数编写C接口,它们是安全的,但你仍然有权在C ++堆而不是Lua堆上分配你的对象。

答案 1 :(得分:1)

好像工厂是走的路?例如。而不是通过“标准”方式在Lua中动态创建对象,你可以调用Create和Destroy函数吗?

答案 2 :(得分:1)

我似乎记得一个同事正在做这种事情,Lua和C ++对象都是一等公民,并且完全可以在两个方向上运作。

如果记忆对我有用,那么它基于Lua++,但此时我不确定,抱歉。

答案 3 :(得分:0)

使用展示位置新功能。有关方便的模板,请参阅here

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

(未经测试,请参阅上面的链接了解详情。)