C++混合编程之idlcpp教程Python篇(3)
上一篇 C++混合编程之idlcpp教程Python篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用。这一篇会有新的内容。
与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++混合编程之idlcpp教程Python篇(3)的更多相关文章
- C++混合编程之idlcpp教程Python篇(9)
上一篇在这 C++混合编程之idlcpp教程Python篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程PythonTutorial7中除了四个文件PythonTu ...
- C++混合编程之idlcpp教程Python篇(8)
上一篇在这 C++混合编程之idlcpp教程Python篇(7) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial6中,同样加入了四个文件:Pyt ...
- C++混合编程之idlcpp教程Python篇(7)
上一篇在这 C++混合编程之idlcpp教程Python篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与PythonTutorial4工程相似,工程PythonTutorial5中,同 ...
- C++混合编程之idlcpp教程Python篇(6)
上一篇在这 C++混合编程之idlcpp教程Python篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程PythonTutorial4中加入了四个文件:PythonTutorial4 ...
- C++混合编程之idlcpp教程Python篇(5)
上一篇在这 C++混合编程之idlcpp教程Python篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial3中,同样加入了三个文件:Py ...
- C++混合编程之idlcpp教程Python篇(4)
上一篇在这 C++混合编程之idlcpp教程Python篇(3) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial2中,同样加入了三个文件 Pyt ...
- C++混合编程之idlcpp教程Python篇(2)
在上一篇 C++混合编程之idlcpp教程(一) 中介绍了 idlcpp 工具的使用.现在对 idlcpp 所带的示例教程进行讲解,这里针对的 Python 语言的例子.首先看第一个示例程序 Pyth ...
- C++混合编程之idlcpp教程Lua篇(6)
上一篇在这 C++混合编程之idlcpp教程Lua篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程LuaTutorial4中加入了四个文件:LuaTutorial4.cpp, Tut ...
- C++混合编程之idlcpp教程Lua篇(9)
上一篇在这 C++混合编程之idlcpp教程Lua篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程LuaTutorial7中除了四个文件LuaTutorial7.c ...
随机推荐
- Ms sql pivot unpivot
--建表 create table dbo.orders ( orderid int not null primary key nonclustered, orderdate datetime not ...
- 用shell脚本切分task_list,并分别执行的脚本
#/bin/sh TASK_LIST=$ len=`wc -l $TASK_LIST | awk '{print $1}'` #noExce(){ ) ))'p' $TASK_LIST > $T ...
- MSSQLSERVER之发布-分发-订阅
一.环境 发布服务器 O S: Windows servier 2003 64位 Soft: Microsoft SqlServer 2008 R2 I P: 192.168.3.70 HOST-NA ...
- c#基础-oop(面向对象理解)
OOP-面向对象 封装,继承多态 一个桌子,用面向对象来描述一下它这个桌子项目 定义桌子类 对象:桌子 桌子的属性:名字,材质,体积 桌子的方法;放东西(方法) 现在桌子要放书,放花瓶,放文件(这里就 ...
- nginx 启动,停止和重新加载配置
要启动nginx的,运行可执行文件.一旦nginx的启动时,它可以通过与-s参数调用可执行来控制.使用以下语法 nginx -s signal 其中,信号可以是下列之一: stop - fast sh ...
- 2.openssl rsa/pkey
分别是RSA密钥的处理工具和通用非对称密钥处理工具.它们用法基本一致,所以只介绍openssl rsa. [root@xuexi tmp]# man rsa NAME rsa - RSA key pr ...
- centos6.x下手工安装二进制Docker v1.1x
Docker在 centos 6.x 下面默认最新的版本是1.7, 然而这个并不符合我的实际需求, 尤其我需要 docker-compose 来作为编配工具部署swarm, 所以只有使用二进制的安装包 ...
- Mahout源码分析之 -- QR矩阵分解
一.算法原理 请参考我在大学时写的<QR方法求矩阵全部特征值>,其包含原理.实例及C语言实现:http://www.docin.com/p-114587383.html 二.源码分析 这里 ...
- java基础七 [图形用户接口](阅读Head First Java记录)
到目前为止我们接触的都是Java的命令行,但是为了让用户使用,必须有图形化界面,所以这章主要讲的是怎么使用GUI(图形用户接口) 创建一个GUI:javax.swing.* 本章讲的布局相关内容都 ...
- std::back_inserter函数用法
back_inserter函数:配合copy函数,把[a, b)区间的数据插入到string对象的末尾,如果容量不够,动态扩容. 使用案例: 1.客户端与服务器通信场景:服务器向客户端发送数据,客户端 ...