上一篇在这 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);

编译运行结果如下图:

C++混合编程之idlcpp教程Python篇(4)的更多相关文章

  1. C++混合编程之idlcpp教程Python篇(9)

    上一篇在这 C++混合编程之idlcpp教程Python篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程PythonTutorial7中除了四个文件PythonTu ...

  2. C++混合编程之idlcpp教程Python篇(8)

    上一篇在这 C++混合编程之idlcpp教程Python篇(7) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial6中,同样加入了四个文件:Pyt ...

  3. C++混合编程之idlcpp教程Python篇(7)

    上一篇在这 C++混合编程之idlcpp教程Python篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与PythonTutorial4工程相似,工程PythonTutorial5中,同 ...

  4. C++混合编程之idlcpp教程Python篇(6)

    上一篇在这 C++混合编程之idlcpp教程Python篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程PythonTutorial4中加入了四个文件:PythonTutorial4 ...

  5. C++混合编程之idlcpp教程Python篇(5)

    上一篇在这  C++混合编程之idlcpp教程Python篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial3中,同样加入了三个文件:Py ...

  6. C++混合编程之idlcpp教程Python篇(3)

    上一篇 C++混合编程之idlcpp教程Python篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用.这一篇会有新的内容. 与PythonTutorial0相似,工程Pyth ...

  7. C++混合编程之idlcpp教程Python篇(2)

    在上一篇 C++混合编程之idlcpp教程(一) 中介绍了 idlcpp 工具的使用.现在对 idlcpp 所带的示例教程进行讲解,这里针对的 Python 语言的例子.首先看第一个示例程序 Pyth ...

  8. C++混合编程之idlcpp教程Lua篇(6)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程LuaTutorial4中加入了四个文件:LuaTutorial4.cpp, Tut ...

  9. C++混合编程之idlcpp教程Lua篇(9)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程LuaTutorial7中除了四个文件LuaTutorial7.c ...

随机推荐

  1. Spring day04笔记(SVN讲解和回顾昨天知识)

    spring day03回顾 事务管理 基于xml配置 1.配置事务管理器 jdbc:DataSourceTransactionManager hibernate:HibernateTransacti ...

  2. FORM触发器执行顺序

    触发器执行顺序: 1. 当打开FORM时: (1) PRE-FORM (2) PRE-BLOCK(BLOCK级) (3) WHEN-NEW-FORM-INSTANCE (4) WHEN-NEW-BLO ...

  3. Mongodb数据导出工具mongoexport和导入工具mongoimport介绍

    一.导出工具mongoexport Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件.可以通过参数指定导出的数据项,也可以根据指定的条件导 ...

  4. 并查集(HDOJ 1856)

    并查集   英文:Disjoint Set,即“不相交集合” 将编号分别为1…N的N个对象划分为不相交集合, 在每个集合中,选择其中某个元素代表所在集合. 常见两种操作: n       合并两个集合 ...

  5. c++学习笔记——聚合类

    聚合类定义:1.所有的成员都是public的. 2.没有定义任何构造函数. 3.没有类内初始值. 4.没有基类,也没有virtual函数. 聚合类的初始化:我们可以提供一个花括号括起来的成员函数初始值 ...

  6. Spring HtmlUtils把HTML编码转义,可将HTML标签互相转义

    Spring HtmlUtils把HTML编码转义,可将HTML标签互相转义 2014年09月05日 ⁄ 综合 ⁄ 共 372字 ⁄ 字号 小 中 大 ⁄ 评论关闭   org.springframe ...

  7. 构建ASP.NET网站十大必备工具(1)

    最近使用ASP.NET为公司构建了一个简单的公共网站(该网站的地址:http://superexpert.com/).在这个过程中,我们使用了数量很多的免费工具,如果把构建ASP.NET网站的必备工具 ...

  8. storyboard xib下label怎么自适应宽度高度

    先看需求:两个Label,要求蓝色的label紧跟在红色的label文字后面  ok首选正常添加约束 红色的Label添加宽度,高度,左边,上边约束 蓝色的Label添加宽度,高度,左边,和红色的水平 ...

  9. (九) 一起学 Unix 环境高级编程 (APUE) 之 线程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  10. html+css-----补

    其实html没什么好补充的了,主要是使用css如何构造出各种想要的效果 1.加减框 <!DOCTYPE html> <html lang="en"> < ...