C++混合编程之idlcpp教程Python篇(3)
2016-03-27 22:40
381 查看
上一篇 C++混合编程之idlcpp教程Python篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用。这一篇会有新的内容。
与PythonTutorial0相似,工程PythonTutorial1中,同样加入了三个文件
PythonTutorial1.cpp, Tutorial1.i, tutorial1.py
其中PythonTutorial1.cpp的内容基本和PythonTutorial0.cpp雷同,不再赘述。
首先看一下Tutorial1.i的内容:
编译后生成的Tutorial1.h的内容如下:
上面生成的代码中有一些是多余的,待以后改进编译器再来消除这些多余的代码。
struct Point 定义了一个结构体。
下面两行
float x;
float y;
表示其中有两个float类型的数据成员x和y。
然后下一行
nocode Point();
这是idlcpp特有的关键字,在C++中没有对应的存在。如上所述,idlcpp编译.i文件生成对应头文件代码同时,还会生成元数据代码。比如上面这行代码
float x;
idlcpp在tutorial1.h中生成了同样的成员声明,同时在元数据代码中也有对应的代码生成。但是有时候,我们只希望在元数据中生成相应代码,而头文件中不需要有对应的代码。或者是相反的情形,即只希望在头文件中生成相应代码,而元数据中不需要有对应的代码。为应对这些情况,idlcpp提供了两个关键字nocode和nometa。可以放在 namespace, struct, class, enum, field, property, method, operator 之前。其中nocode表示只在元数据中生成对应代码,不在头文件中生成;nometa表示只在头文件中生成对应的代码,不在元数据中生成。如果不使用这两个关键字,则在头文件和元数据中都产生对应的代码。
nocode Point();
即在头文件中不需要默认构造函数的声明,从而也无需在外面写一个默认构造函数的实现。此处需要在元数据中生成对应的代码基于下面的规定,对于值类型来说:
如果类型的声明中有构造函数,则在元数据中生成静态函数New,用于在脚本语言中创建一个对象。见Tutorial1.mh中的Point_New。这样在脚本语言中可以通过调用Point.New()来创建一个Point对象。
如果类型的声明中有默认构造函数,则会在元数据中生成静态函数NewArray,用于在脚本语言中创建一个对象数组。见Tutorial1.mh中的Point_NewArray。
然后看一下脚本tutorial1.py的内容:
编译运行结果如下图:
这一行
pt = paf.tutorial.Point.New();
是new一个 Point对象,变量pt保存其引用。
相当于C++中的 ::tutorial::Point* pt = new ::tutorial::Point();
下面两行
pt.x = 1;
pt.y = 2;
相当于C++中的
pt->x = 1;
pt->y = 2;
下面两行print输出结果即上图的前两行。在使用idlcpp时,C++中的任何类型(包括原生类型如int, float等)在Python中都是PyObject。要将C++原生类型转换到Python中对应的类型需使用._语法,参看最后两行print语句。
与PythonTutorial0相似,工程PythonTutorial1中,同样加入了三个文件
PythonTutorial1.cpp, Tutorial1.i, tutorial1.py
其中PythonTutorial1.cpp的内容基本和PythonTutorial0.cpp雷同,不再赘述。
首先看一下Tutorial1.i的内容:
namespace tutorial { struct Point { float x; float y; nocode Point(); }; }
编译后生成的Tutorial1.h的内容如下:
//DO NOT EDIT THIS FILE, it is generated by idlcpp //http://www.idlcpp.org #pragma once namespace tutorial{ struct Point; } namespace tutorial { struct Point { public: float x; float y; }; }
上面生成的代码中有一些是多余的,待以后改进编译器再来消除这些多余的代码。
struct Point 定义了一个结构体。
下面两行
float x;
float y;
表示其中有两个float类型的数据成员x和y。
然后下一行
nocode Point();
这是idlcpp特有的关键字,在C++中没有对应的存在。如上所述,idlcpp编译.i文件生成对应头文件代码同时,还会生成元数据代码。比如上面这行代码
float x;
idlcpp在tutorial1.h中生成了同样的成员声明,同时在元数据代码中也有对应的代码生成。但是有时候,我们只希望在元数据中生成相应代码,而头文件中不需要有对应的代码。或者是相反的情形,即只希望在头文件中生成相应代码,而元数据中不需要有对应的代码。为应对这些情况,idlcpp提供了两个关键字nocode和nometa。可以放在 namespace, struct, class, enum, field, property, method, operator 之前。其中nocode表示只在元数据中生成对应代码,不在头文件中生成;nometa表示只在头文件中生成对应的代码,不在元数据中生成。如果不使用这两个关键字,则在头文件和元数据中都产生对应的代码。
nocode Point();
即在头文件中不需要默认构造函数的声明,从而也无需在外面写一个默认构造函数的实现。此处需要在元数据中生成对应的代码基于下面的规定,对于值类型来说:
如果类型的声明中有构造函数,则在元数据中生成静态函数New,用于在脚本语言中创建一个对象。见Tutorial1.mh中的Point_New。这样在脚本语言中可以通过调用Point.New()来创建一个Point对象。
如果类型的声明中有默认构造函数,则会在元数据中生成静态函数NewArray,用于在脚本语言中创建一个对象数组。见Tutorial1.mh中的Point_NewArray。
然后看一下脚本tutorial1.py的内容:
import pafpython; paf = pafpython.paf; pt = paf.tutorial.Point.New(); pt.x = 1; pt.y = 2; print(pt.x); print(pt.y); print(pt.x._); print(pt.y._);
编译运行结果如下图:
这一行
pt = paf.tutorial.Point.New();
是new一个 Point对象,变量pt保存其引用。
相当于C++中的 ::tutorial::Point* pt = new ::tutorial::Point();
下面两行
pt.x = 1;
pt.y = 2;
相当于C++中的
pt->x = 1;
pt->y = 2;
下面两行print输出结果即上图的前两行。在使用idlcpp时,C++中的任何类型(包括原生类型如int, float等)在Python中都是PyObject。要将C++原生类型转换到Python中对应的类型需使用._语法,参看最后两行print语句。
相关文章推荐
- 高级强制类型转换
- C++学习
- C/C++知识点整理(3)
- 如何避免内存泄漏
- 副本构造器
- gets和scanf函数初篇
- c语言实现des加密
- c++实验2—标准体重
- 关于C++中delete和delete[]的差别
- 表面静如处子其实动如脱兔的static
- C++第二次上机实验-3
- c++实验2-标准体重
- 想找C++开发职位必读的书,以及其他条件
- C++学习笔记55——类模板的输入输出操作符
- c语言:顺序栈的实现
- C++面向对象和流
- 九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题) C++版
- C++ const的各种用法
- C++设计模式之适配器(Adapter)模式
- Java客户端与C++服务器端通信