luapp 不修改不继承c++原类并将其导出到lua

在前两篇看到luapp能方便的导出c++类给lua使用

对于现有类,也可以通过类继承到方式进行导出。

那么可以通过不继承的方式导出现有类吗?

肯定可以啊,先模拟一个现有类。

 //不修改类的情况
 class Existed_NoModify {
 protected:
	 Existed_NoModify() { printf("Existed_NoModify Create!\n"); }//不能在外部构造
	 ~Existed_NoModify(){ printf("Existed_NoModify Destroy!\n"); }//不能在外部析构
 public:
	 void print() {
		 printf("existed class print\n");
	 }

	 //模拟未导出到lua的构造函数/类工厂
	 static Existed_NoModify* Create() {
		 return new Existed_NoModify();
	 }
     //模拟析构
	 static void DestroyObj(Existed_NoModify* o) {
		 delete o;
	 }
 };

这种情况就不好派生了,因为类工厂可能对新建对象做额外的工作。

派生类调用基类默认构造函数创建对象可能无法达到目的,有的基类甚至直接把构造函数private。

当然也可以通过定义一个wrap类的方式实现,但是显得有点繁琐。

对于已有类,可以使用以下方式:

LUA_CLASS_EXPORT_BEGIN_EXIST(Existed_NoModify)  //导出实现开始
	 LUA_CLASS_EXPORT_FUNC("eprint", &Existed_NoModify::print)
LUA_CLASS_EXPORT_END() //结束

直接使用 LUA_CLASS_EXPORT_BEGIN_EXIST 宏。

但是对于例子的这个类,我们还需要实现构造和析构,也有两种方式:

 //使用函数特例化方式重新构造/析构对象
 namespace app {
	 namespace lua {
		 template<> Existed_NoModify* CreateExportLuaObject<Existed_NoModify>() {
			 return Existed_NoModify::Create();
		 }
		 template<> void DestroyExportLuaObject<Existed_NoModify>(Existed_NoModify *o) {
			 Existed_NoModify::DestroyObj(o);
		 }
	 }
 }

 //使用宏方式重新构造对象
//#undef LUA_EXPORT_NEWOBJ
//#define LUA_EXPORT_NEWOBJ(t,l) Existed_NoModify::Create()


//使用宏方式重新定义析构
//#undef LUA_EXPORT_DESTROYOBJ
//#define LUA_EXPORT_DESTROYOBJ(n,o) Existed_NoModify::DestroyObj(*(Existed_NoModify**)o)

 

注意,使用的时候需要把它们放在 LUA_CLASS_EXPORT_BEGIN_EXIST 前面。

最后使用宏注册即可

 //类导出注册给lua
LUA_CLASS_EXIST_REG(Existed_NoModify, lw.get());

结果比较简单就不写了,新的代码已提交到github  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值