在前两篇看到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