关于squirrel语言与C++的自动绑定问题(1)

来源:互联网 发布:多宝视训练软件价格 编辑:程序博客网 时间:2024/05/01 02:25

我写过一个库,用于将C++的对象自动绑定到squirrel语言中,自己觉得比以前公开的那些库要更方便一些,所以决定写这个文章

squirrel语言我就不说了,lua的改进型,小众但有效,如何将一个C++类绑定到squirrel语言,让squirrel得到快速扩展是一个问题,我们不想为每个C++类函数专门写一个接口函数,那么利用模板和宏是否可以自动做到这一点呢?


考察一个一般的C++类,可以发现引用了有很多C++类(例如Point,LineSegment,GEO等),这些类都是我们自己定义的,它们被作为数据记录,作为参数....,对于squirrel语言来说,这就悲剧了,它是无类型(弱类型)的脚本语言,如何在不了解这些C++类型结构的情况下自动处理这么多的C++类型。

class APW_area //进行告警区计算的对象
{
private:
    double det3(double *a) ;//三阶行列式计算
    double Multiply(Point p1, Point p2, Point p0) ;   // 计算叉乘 |P1P0| × |P2P0|
     bool IsOnline(Point point, LineSegment line);  // 判断线段是否包含点point
     bool Intersect(LineSegment L1, LineSegment L2);  // 判断线段相交

    string name;
    GEO centre;
    double HLevel,LLevel; //多边形区的上下高度界限,这里以米为单位
    vector<Point> polygon;

public:
     vector<GEO> expand(double dist); //多边形或者线段缩放指定的距离,单位为米,正为扩大,负为缩小
    bool insert(GEO* pt);
    bool append(const char* pS);
    int in_bar(GEO* pt,double width) ;//航段匹配,返回0标示不在航线内,返回正数表示过点(1为起始点),返回负数表示过航段(-1为起始点)
    bool in_polygon;(GEO* pt) /// 判断点在多边形内所谓多边形,这里必须定义超过3点以上才可以
    bool in_area(GEO* pt);
};

问题不好解决,但并不是不能解决,squirrel语言毕竟支持C指针,而且也支持“类”,我设想为每个需要使用的C++类在squirrel语言中设定一个类名,而且将这个脚本语言的对象填写为一个C++对象的指针,在脚本语言中也就是这样。

local aa=APW_area();  //创建一个C++对象的指针,此时对象没有构造,aa包含的值还是一个空指针

aa.create();  //创建这个C++对象,此时应该申请该对象的内存并执行C++对象的构造

aa.append("201212N11211212E");  //执行C++对象的方法

这样看上去是不是很好,我们几乎可以直接使用C++类了,这可以重用很多C++库,再通过脚本语言的高效开发快速写代码。



0 0