python和idl_C++混合编程之idlcpp教程Python篇(4)

本文介绍了如何在Python中使用idlcpp进行混合编程,通过一个名为PythonTutorial2的工程实例,详细讲解了idlcpp如何处理C++结构体和属性,并展示了如何在Python中调用生成的接口进行操作。内容包括struct Point和Rectangle的定义、构造函数、属性的使用及在Python脚本中的应用。
摘要由CSDN通过智能技术生成

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

namespacetutorial

{structPoint

{floatx;floaty;

nocode Point();

nocode Point(float a, floatb);#{Point()

{}

Point(float a, floatb)

{

x=a;

y=b;

}#}};structRectangle

{

Point m_min;

Point m_max;float left set get;float right set get;

nocodefloat bottom set get;

nocodefloat top set get;

nocodefloat area get;

nocodefloatgetArea();

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

Rectangle();

nocode Rectangle(const Rectangle&pt);#{

void set_bottom(floatbottom)

{

m_min.y=bottom;

}floatget_bottom()

{returnm_min.y;

}void set_top(floattop)

{

m_max.y=top;

}floatget_top()

{returnm_max.y;

}floatget_area()

{return (m_max.x - m_min.x)*(m_max.y -m_min.y);

}floatgetArea()

{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()

{}

inlinefloatRectangle::get_left()

{returnm_min.x;

}

inlinevoid Rectangle::set_left(floatleft)

{

m_min.x=left;

}

inlinefloatRectangle::get_right()

{returnm_max.x;

}

inlinevoid Rectangle::set_right(floatright)

{

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{ structRectangle; }namespacetutorial

{structPoint

{public:floatx;floaty;public:static Point*New();static Point* New(float a,floatb);static Point* NewArray(unsigned intcount);

Point()

{}

Point(float a, floatb)

{

x=a;

y=b;

}

};structRectangle

{public:

Point m_min;

Point m_max;void set_left( float);floatget_left();void set_right( float);floatget_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 intcount);static Rectangle* Clone(const Rectangle&pt);void set_bottom(floatbottom)

{

m_min.y=bottom;

}floatget_bottom()

{returnm_min.y;

}void set_top(floattop)

{

m_max.y=top;

}floatget_top()

{returnm_max.y;

}floatget_area()

{return (m_max.x - m_min.x)*(m_max.y -m_min.y);

}floatgetArea()

{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()

{}

inlinefloatRectangle::get_left()

{returnm_min.x;

}

inlinevoid Rectangle::set_left(floatleft)

{

m_min.x=left;

}

inlinefloatRectangle::get_right()

{returnm_max.x;

}

inlinevoid Rectangle::set_right(floatright)

{

m_max.x=right;

}

}

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

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

importpafpython;

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

编译运行结果如下图:

695a239bbe3e6988dabf28220e794bab.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值