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;
    meta:
        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;
    public:
        static Point* New();
        static Point* NewArray(unsigned int count);

    };
}

编译后生成的Tutorial1.ic的内容如下:

//DO NOT EDIT THIS FILE, it is generated by idlcpp
//http://www.idlcpp.org

#pragma once

#include "Tutorial1.h"
#include "Tutorial1.mh"
#include "../../paf/src/pafcore/RefCount.h"

namespace tutorial
{

    inline Point* Point::New()
    {
        return new Point();
    }

    inline Point* Point::NewArray(unsigned int count)
    {
        return new_array<Point>(count);
    }

}

上面生成的代码中有一些是多余的,待以后改进编译器再来消除这些多余的代码。

struct Point 定义了一个结构体。

下面两行

float x;

float y;

表示其中有两个float类型的数据成员x和y。

然后下一行

meta:

这是idlcpp特有的关键字,在C++中没有对应的存在。如上所述,idlcpp编译.i文件生成对应头文件代码同时,还会生成元数据代码。比如上面这行代码

float x;

idlcpp在tutorial1.h中生成了同样的成员声明,同时在元数据代码中也有对应的代码生成。但是有时候,我们只希望在元数据中生成相应代码,而头文件中不需要有对应的代码。或者是相反的情形,即只希望在头文件中生成相应代码,而元数据中不需要有对应的代码。为应对这些情况,idlcpp提供了三个关键字native,meta,all。用法和C++类声明中的public, protected, private用法类似。即在struct 或 class中以

native:

meta:

all:

三种形式出现,影响其后的成员声明,直到遇到下一个相应的关键字。其中native表示只在头文件中生成对应的代码,不在元数据中生成,meta表示只在元数据中生成对应代码,不在头文件中生成。all表示在头文件和元数据中都生成对应代码。默认值为all。此处meta关键字影响下面的这行代码

Point();

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

  1. 如果类型的声明中有构造函数(非拷贝构造函数),则会生成静态函数New,用于在脚本语言中创建一个对象。见Tutorial1.ic中的Point::New()。这样在脚本语言中可以通过调用Point.New()来创建一个Point对象。
  2. 如果类型的声明中有拷贝构造函数,则会生成静态函数Clone,用于在脚本语言中复制一个对象。
  3. 如果类型的声明中有默认构造函数,则会生成静态函数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语句。

时间: 2024-10-05 03:04:33

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

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

上一篇在这 C++混合编程之idlcpp教程Python篇(7) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial6中,同样加入了四个文件:PythonTutorial6.cpp, Tutorial6.cpp, Tutorial6.i, tutorial6.py.其中PythonTutorial6.cpp的内容基本和PythonTutorial5.cpp雷同,不再赘述.首先看一下Tutorial6.i的内容: #import "../../p

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

上一篇在这 C++混合编程之idlcpp教程Python篇(3) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial2中,同样加入了三个文件 PythonTutorial2.cpp, Tutorial2.i, tutorial2.py.其中PythonTutorial2.cpp的内容基本和PythonTutorial1.cpp雷同,不再赘述.首先看一下Tutorial2.i的内容: namespace tutorial { struct Poi

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

上一篇在这  C++混合编程之idlcpp教程Python篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial3中,同样加入了三个文件:PythonTutorial3.cpp, Tutorial3.i, tutorial3.py.其中PythonTutorial3.cpp的内容基本和PythonTutorial2.cpp雷同,不再赘述. 首先看一下Tutorial3.i的内容: namespace tutorial { struct P

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

上一篇在这 C++混合编程之idlcpp教程Python篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程PythonTutorial7中除了四个文件PythonTutorial7.cpp, Tutorial7.cpp, Tutorial7.i, tutorial7.py 外,Tutorial6.cpp也被加入了此工程中.其中PythonTutorial7.cpp的内容基本和PythonTutorial6.cpp雷同,不再赘述.首先看一下Tutorial7.i的

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

上一篇在这 C++混合编程之idlcpp教程Python篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与PythonTutorial4工程相似,工程PythonTutorial5中,同样加入了四个文件:PythonTutorial5.cpp, Tutorial5.cpp, Tutorial5.i, tutorial5.py.其中PythonTutorial5.cpp的内容基本和PythonTutorial4.cpp雷同,不再赘述.首先看一下Tutorial5.i的内容: #imp

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

上一篇在这  C++混合编程之idlcpp教程Lua篇(3) 与前面的工程相似,工程LuaTutorial2中,同样加入了三个文件 LuaTutorial2.cpp, Tutorial2.i, tutorial2.lua.其中LuaTutorial2.cpp的内容基本和LuaTutorial1.cpp雷同,不再赘述. 首先看一下Tutorial2.i的内容: namespace tutorial { struct Point { float x; float y; meta: Point();

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

上一篇在这 C++混合编程之idlcpp教程Lua篇(7) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程LuaTutorial6中,同样加入了四个文件:LuaTutorial6.cpp, Tutorial6.cpp, Tutorial6.i, tutorial6.lua.其中LuaTutorial6.cpp的内容基本和LuaTutorial5.cpp雷同,不再赘述. 首先看一下Tutorial6.i的内容: namespace tutorial { template

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

上一篇在这 C++混合编程之idlcpp教程Lua篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程LuaTutorial7中除了四个文件LuaTutorial7.cpp, Tutorial7.cpp, Tutorial7.i, tutorial7.lua 外,Tutorial6.cpp也被加入了此工程中.其中LuaTutorial7.cpp的内容基本和LuaTutorial6.cpp雷同,不再赘述. 首先看一下Tutorial7.i的内容: #import "

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

上一篇在这 C++混合编程之idlcpp教程Lua篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与LuaTutorial4工程相似,工程LuaTutorial5中,同样加入了四个文件:LuaTutorial5.cpp, Tutorial5.cpp, Tutorial5.i, tutorial5.lua.其中LuaTutorial5.cpp的内容基本和LuaTutorial4.cpp雷同,不再赘述. 首先看一下Tutorial5.i的内容: #import "../../paf/s