zoukankan      html  css  js  c++  java
  • C++混合编程之idlcpp教程Python篇(4)

    上一篇在这 C++混合编程之idlcpp教程Python篇(3)

    第一篇在这 C++混合编程之idlcpp教程(一)

    与前面的工程相似,工程PythonTutorial2中,同样加入了三个文件 PythonTutorial2.cpp, Tutorial2.i, tutorial2.py。其中PythonTutorial2.cpp的内容基本和PythonTutorial1.cpp雷同,不再赘述。首先看一下Tutorial2.i的内容:

     

    namespace tutorial
    {
        struct Point
        {
            float x;
            float y;
            nocode Point();
            nocode Point(float a, float b);
            #{
            Point()
            {}
            Point(float a, float b)
            {
                x = a;
                y = b;
            }
            #}
        };
    
        struct Rectangle
        {
            Point m_min;
            Point m_max;
    
            float left set get;
            float right set get;
    
            nocode float bottom set get;
            nocode float top set get;
            nocode float area get;
            nocode float getArea();
    
            Rectangle(const Point& min, const Point& max);
            Rectangle();
            nocode Rectangle(const Rectangle& pt);
            #{
            void set_bottom(float bottom)
            {
                m_min.y = bottom;
            }
            float get_bottom()
            {
                return m_min.y;
            }
            void set_top(float top)
            {
                m_max.y = top;
            }
            float get_top()
            {
                return m_max.y;
            }
            float get_area()
            {
                return (m_max.x - m_min.x)*(m_max.y - m_min.y);
            }
            float getArea()
            {
                return (m_max.x - m_min.x)*(m_max.y - m_min.y);
            }
            #}
        };
        #{
        inline Rectangle::Rectangle(const Point& min, const Point& max) : m_min(min), m_max(max)
        {
        }
        inline Rectangle::Rectangle()
        {}
        inline float Rectangle::get_left()
        {
            return m_min.x;
        }
        inline void Rectangle::set_left(float left)
        {
            m_min.x = left;
        }
        inline float Rectangle::get_right()
        {
            return m_max.x;
        }
        inline void Rectangle::set_right(float right)
        {
            m_max.x = right;
        }
        #}
    }

    在这里仍然有struct Point。与PythonTutorial1中的struct Point相比,除了原来的默认构造函数外,多了一个带两个参数的构造函数

    Point(float a, float b);

    两个构造函数都在meta: 段中,所以idlcpp不会在Tutorial2.h中生成对应的函数声明,所在直接在后面的#{#}写上构造函数的实现代码,这些代码会插入到Tutorial2.h中的对应位置。当然也可以不使用meta:,这样的话这两个构造函数的声明部分就会出现在Tutorial2.h的struct Point中,那么实现代码就要写在外面了。在struct Point后添加了一个新的类型struct Rectangle。前两行

    Point m_min;

    Point m_max;

    声明了两个数据成员。然后是

    float left set get;

    float right set get;

    这里又出现了新的语法:属性。属性语法来自于C#。形式为: 类型 + 名称 + 可选的set和get。在C++中实际上是生成了两个对应的成员函数,函数名分别为set_ + 属性名称,get_ + 属性名称,比如为属性left生成的两个成员函数为:void set_left(float)和float get_left()。然后还有三个属性的声明

    float bottom set get;

    float top set get;

    float area get;

    其中属性area是只读属性,即只生成float get_area()成员函数。然后是

    float getArea();

    这是一个成员函数,在C++生成中的函数形式和这里是一样的。然后是

    Rectangle(const Point& min, const Point& max);   

    Rectangle();   

    nocode Rectangle(const Rectangle& pt);

    此处一共三个构造函数,其中最后一个是拷贝构造函数,对于此类来说,拷贝构造函数可以不写。所以加了nocode前缀。于是在头文件只会有两个构造函数声明,但是在元数据中静态函数New共有三个重载函数。分别对于上面三个构造函数。

    后面就是具体函数的实现代码。都放在#{#}中以便复制到头文件中。 

    编译后生成的Tutorial2.h的内容如下:

     

    //DO NOT EDIT THIS FILE, it is generated by idlcpp
    //http://www.idlcpp.org
    
    #pragma once
    
    #include "./Tutorial2.h"
    namespace tutorial{ struct Rectangle; }
    
    namespace tutorial
    {
        struct Point
        {
        public:
    
            float x;
            float y;
        public:
            static Point* New();
            static Point* New(float a,float b);
            static Point* NewArray(unsigned int count);
    
    
            Point()
            {}
            Point(float a, float b)
            {
                x = a;
                y = b;
            }
            
        };
    
        struct Rectangle
        {
        public:
    
            Point m_min;
            Point m_max;
    
            void set_left( float);
            float get_left();
            void set_right( float);
            float get_right();
    
            Rectangle(const Point& min,const Point& max);
            Rectangle();
        public:
            static Rectangle* New(const Point& min,const Point& max);
            static Rectangle* New();
            static Rectangle* NewArray(unsigned int count);
            static Rectangle* Clone(const Rectangle& pt);
    
    
            void set_bottom(float bottom)
            {
                m_min.y = bottom;
            }
            float get_bottom()
            {
                return m_min.y;
            }
            void set_top(float top)
            {
                m_max.y = top;
            }
            float get_top()
            {
                return m_max.y;
            }
            float get_area()
            {
                return (m_max.x - m_min.x)*(m_max.y - m_min.y);
            }
            float getArea()
            {
                return (m_max.x - m_min.x)*(m_max.y - m_min.y);
            }
            
        };
    
        inline Rectangle::Rectangle(const Point& min, const Point& max) : m_min(min), m_max(max)
        {
        }
        inline Rectangle::Rectangle()
        {}
        inline float Rectangle::get_left()
        {
            return m_min.x;
        }
        inline void Rectangle::set_left(float left)
        {
            m_min.x = left;
        }
        inline float Rectangle::get_right()
        {
            return m_max.x;
        }
        inline void Rectangle::set_right(float right)
        {
            m_max.x = right;
        }
        
    }

     内容基本上都是和Tutorial2.i中一一对应的

     然后看一下脚本tutorial2.py的内容:

     

    import pafpython;
    paf = pafpython.paf;
    
    rect1 = paf.tutorial.Rectangle();
    rect1.m_min.x = 1;
    rect1.m_min.y = 2;
    
    print(rect1.left._);
    print(rect1.bottom._);
    
    rect1.right = 3;
    rect1.top = 4;
    
    print(rect1.m_max.x._);
    print(rect1.m_max.y._);
    
    print(rect1.area._);
    
    rect2 = paf.tutorial.Rectangle(rect1.m_min, paf.tutorial.Point(5,5));
    print(rect2.getArea()._);
    
    rect3 = paf.tutorial.Rectangle.New(rect2);
    print(rect3.getArea()._);

    rect1 = paf.tutorial.Rectangle();

    这是rect1 = paf.tutorial.Rectangle.New(); 的简化写法。

    后面分别用数据成员和属性来操作rect1。

    rect2 = paf.tutorial.Rectangle(rect1.m_min, paf.tutorial.Point(5,5));

    调用了Rectangle带参数的构造函数(实际上是静态函数New)。

    rect3 = paf.tutorial.Rectangle.New(rect2);

    相当于C++中的 Rectangle* rect3 = new Rectangle(*rect2);

    编译运行结果如下图:

     

     

  • 相关阅读:
    laravel 验证码手机与提交手机的验证?
    微信公众平台开发——微信授权登录(OAuth2.0)
    个人网站可以申请微信授权登录吗
    个人网站可以申请微信授权登录吗?
    个体户微信公众号认证怎么做?无公章
    [微信开发] 没有组织机构代码证、公章怎么认证微信公众号?
    mysql中int、bigint、smallint 和 tinyint的区别详细介绍
    laravel5.6 QQ 第三方登录
    如何给网站的链接设置为绝对地址原文链接
    ArcGIS中文件共享锁定数据溢出 这个方法不行,建议用gdb,不要用mdb
  • 原文地址:https://www.cnblogs.com/fdyjfd/p/5346690.html
Copyright © 2011-2022 走看看