zoukankan      html  css  js  c++  java
  • C++混合编程之idlcpp教程Lua篇(3)

     上一篇 C++混合编程之idlcpp教程Lua篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用。这一篇会有新的内容。

    与LuaTutorial0相似,工程LuaTutorial1中,同样加入了三个文件LuaTutorial1.cpp, Tutorial1.i, tutorial1.lua。其中LuaTutorial1.cpp的内容基本和LuaTutorial0.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
        {
        public:
    
            float x;
            float y;
        };
    }

      

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

     struct Point 定义了一个结构体。

    下面两行

    float x;

    float y;

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

    然后下一行

    nocode Point();

    这里 nocode 是 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.lua的内容:

    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等)在lua中都是userdata。要将C++原生类型转换到lua中对应的类型需使用._语法,参看最后两行print语句。

     

  • 相关阅读:
    洛谷 P1706 全排列
    n皇后问题
    跳马
    [HDOJ4612]Warm up(双连通分量,缩点,树直径)
    [POJ3177]Redundant Paths(双连通图,割边,桥,重边)
    [POJ3352]Road Construction(缩点,割边,桥,环)
    [POJ3694]Network(LCA, 割边, 桥)
    [UVA796]Critical Links(割边, 桥)
    [UVA315]Network(tarjan, 求割点)
    [HDOJ2586]How far away?(最近公共祖先, 离线tarjan, 并查集)
  • 原文地址:https://www.cnblogs.com/fdyjfd/p/5317453.html
Copyright © 2011-2022 走看看