c++;课程及;卢阿 我希望有C++对象,我可以在C++和Lua./P>中读写。
我看过: 但是,我不喜欢这种解决方案,因为我的对象有构造函数和析构函数(它们很重要,因为我使用RAII,它们负责引用计数) 我不喜欢PIL解决方案中的对象是在Lua的堆中分配的c++;课程及;卢阿 我希望有C++对象,我可以在C++和Lua./P>中读写。,c++,lua,C++,Lua,我看过: 但是,我不喜欢这种解决方案,因为我的对象有构造函数和析构函数(它们很重要,因为我使用RAII,它们负责引用计数) 我不喜欢PIL解决方案中的对象是在Lua的堆中分配的 我想用自己的方式创建HCT+C++对象,让Lua有一个方法来获取/设置它们。 有人对此有好的教程/链接吗 坦克 工厂似乎是最好的选择?例如,通过“标准”方法动态地创建LUA中的对象,而不是调用一个函数来创建和销毁?< P>一个选项是使用一个轻的用户数据,它允许您在C++堆上分配对象。请参阅lua\u pushlightu
我想用自己的方式创建HCT+C++对象,让Lua有一个方法来获取/设置它们。
有人对此有好的教程/链接吗坦克 工厂似乎是最好的选择?例如,通过“标准”方法动态地创建LUA中的对象,而不是调用一个函数来创建和销毁?< P>一个选项是使用一个轻的用户数据,它允许您在C++堆上分配对象。请参阅
lua\u 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堆上分配完整的用户数据,< /强>用适当的元,其<>强>内容是C++指针上分配的对象的单指针。然后,您可以在Lua编程中遵循该模型。例如,您可以查看Lua
io
库,了解如何处理文件*
。这样,你就可以使用<代码> LualuSqutuaTa/Cuff>函数编写C接口,它们将是安全的,但是你仍然有权在C++堆上分配对象而不是在LUA堆上。使用新的放置。有关方便的模板,请参见:
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;
}
模板
void my_newuserdata(lua_State*L){
新的(重新解释cast(lua_newuserdata(L,sizeof(T)))T();
}
模板
int my_gc(lua_State*l){
重新解释铸造(lua_-tuserdata(L,1))->~T();
返回0;
}
(未经测试,详见链接)
P>我似乎记得一个同事正在进行这种事情,Lua和C++都是第一类公民,在两个方向上都是完全可操作的。如果内存对我来说是正确的,那么它是以内存为基础的,但此时我不确定,对不起。呃,Lua进行内存分配;你在适当的构造函数中加入?我是说你调用一个函数,你用C或C++实现它来新建和删除你的对象,然后你把它交给Lua让它打包或者它做什么。这似乎不像尝试挂接Lua内存分配方案那样容易出现问题,但我必须承认我从未做过类似的事情。简言之,Lua只知道指针。你的工厂函数(TythCytAsType)和无效破坏物(事物*)负责实际的C++魔法。