Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;课程及;卢阿 我希望有C++对象,我可以在C++和Lua./P>中读写。_C++_Lua - Fatal编程技术网

c++;课程及;卢阿 我希望有C++对象,我可以在C++和Lua./P>中读写。

c++;课程及;卢阿 我希望有C++对象,我可以在C++和Lua./P>中读写。,c++,lua,C++,Lua,我看过: 但是,我不喜欢这种解决方案,因为我的对象有构造函数和析构函数(它们很重要,因为我使用RAII,它们负责引用计数) 我不喜欢PIL解决方案中的对象是在Lua的堆中分配的 我想用自己的方式创建HCT+C++对象,让Lua有一个方法来获取/设置它们。 有人对此有好的教程/链接吗 坦克 工厂似乎是最好的选择?例如,通过“标准”方法动态地创建LUA中的对象,而不是调用一个函数来创建和销毁?< P>一个选项是使用一个轻的用户数据,它允许您在C++堆上分配对象。请参阅lua\u pushlightu

我看过:

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

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

我想用自己的方式创建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++魔法。