上一篇 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();
即在頭文件中不須要默認構造函數的聲明,從而也無需在外面寫一個默認構造函數的實現。此處須要在元數據中生成對應的代碼基於下面的規定,對於值類型來講:
而後看一下腳本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語句。