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

即在头文件中不需要默认构造函数的声明,从而也无需在外面写一个默认构造函数的实现。此处需要在元数据中生成对应的代码基于下面的规定,对于值类型来说:

  1. 如果类型的声明中有构造函数,则在元数据中生成静态函数New,用于在脚本语言中创建一个对象。见Tutorial1.mh中的Point_New。这样在脚本语言中可以通过调用Point.New()来创建一个Point对象。
  2. 如果类型的声明中有默认构造函数,则会在元数据中生成静态函数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)的更多相关文章

  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篇(4)

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

  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. 【SSM 3】Mybatis应用,和Hibernate的区别

    PS:每次写概念性的总结,都是各种复制,各种粘,然后各种理解各种猜.但是这一步的总结,决定了我能够再这条路上走的远近和是否开心.是否创造!so,开启Ctrl A+Ctrl C的模式吧. 接触到这个概念 ...

  2. DEDE后台添加新变量出现:Request var not allow!的解决办法 相关案例演

    论坛上很多人都反馈说在后台添加新变量的时候会出现 "Request var not allow!" 的BUG错误,本文主要就是介绍如何去解决这个问题!下面看具体操纵:在DEDE根目 ...

  3. 【转】提高VR渲染速度的最好方法(经典转载)

    VR的基本渲染方法掌握起来并不难,但是最迫切需要解决的问题是VR的出图速度问题.动则需要数小时的渲染时间真的是很难以接受,我们从三个影响速度的参数结合网上一些高手的教程来分析一下. 一.Irradia ...

  4. 【EF学习笔记06】----------加载关联表的数据 延迟加载

    讲解之前,先来看一下我们的数据库结构:班级表 学生表 延迟加载 //延迟加载 using (var db = new Entities()) { //查询班级 var classes = (from ...

  5. 看完 《重来(REWORK)》

    最近看完了<重来>这本书,作者是贾森 弗里德,又是一位创业成功人士. 但是从这本书来看,感觉作者更像是一位布道者,极力推荐这本书 <重来——更为简单有效的商业思维>. 公司不一 ...

  6. Bitmap 的bitmapdata和texture区别

    Texture:纹理类是对不同平台不同的图片资源的封装在HTML5中,资源是一个HTMLElement对象在OpenGL / WebGL中,资源是一个提交GPU后获取的纹理idTexture类封装了这 ...

  7. 【kettle】window安装与配置

    1.下载kettle包,并解压http://community.pentaho.com/projects/data-integration/2.安装jdk,并配置java环境 a).打开我的电脑--属 ...

  8. Border-radius属性--设置圆角边框

    border-radius:该属性允许您为元素添加圆角边框! div { border:2px solid; border-radius:25px; -moz-border-radius:25px; ...

  9. C语言 malloc、calloc、realloc的区别

    三个函数的申明分别是: void* malloc(unsigned size); void* realloc(void* ptr, unsigned newsize); void* calloc(si ...

  10. oc中的枚举定义

    typedef NS_ENUM(类型,枚举名){        枚举名+值名,       枚举名+值名,}; 该方法定义的枚举,OC会自动把其转换成合适当前版本的枚举.如果枚举值可合并的话 NS_E ...