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

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

    与前面的工程相似,工程LuaTutorial2中,同样加入了三个文件 LuaTutorial2.cpp, Tutorial2.i, tutorial2.lua。其中LuaTutorial2.cpp的内容基本和LuaTutorial1.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

    与LuaTutorial1中的struct Point相比,除了原来的默认构造函数外,多了一个带两个参数的构造函数

    Point(float a, float b);

    两个构造函数都有nocode修饰中,所以idlcpp不会在Tutorial2.h中生成对应的函数声明,所在直接在后面的#{#}写上构造函数的实现代码,这些代码会插入到Tutorial2.h中的对应位置。当然也可以不使用nocode,这样的话这两个构造函数的声明部分就会出现在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;
    
            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();
          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.lua的内容:

     

    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);

    或者这一句可以利用lua的语法特点简写为 rect3 = rect2:New();

    编译运行结果如下图:

     

     

     

     

    C++混合编程之idlcpp教程(一)

  • 相关阅读:
    使用url_for()时,会自动调用转换器的to_url()方法
    自定义flask转换器
    flask自有转换器:int、float、path。默认string
    flask中重定向所涉及的反推:由视图函数反推url
    mysqldump 命令使用
    PIX 防火墙
    MySQL 常用show 语句
    防火墙与入侵检测技术
    mysql DQL语言操作
    mysql 视图
  • 原文地址:https://www.cnblogs.com/fdyjfd/p/5339439.html
Copyright © 2011-2022 走看看