C++混合編程之idlcpp教程Lua篇(3)

 上一篇 C++混合編程之idlcpp教程Lua篇(2) 是一個 hello world 的例子,僅僅涉及了靜態函數的調用。這一篇會有新的內容。html

與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 定義了一個結構體。post

下面兩行lua

float x;url

float y;spa

表示其中有兩個float類型的數據成員x和y。code

而後下一行htm

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語句。

相關文章
相關標籤/搜索