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

来源:http://www.cnblogs.com/fdyjfd/archive/2016/03/30/5339439.html
-Advertisement-
Play Games

上一篇在這 C++混合編程之idlcpp教程Lua篇(3) 與前面的工程相似,工程LuaTutorial2中,同樣加入了三個文件 LuaTutorial2.cpp, Tutorial2.i, tutorial2.lua。其中LuaTutorial2.cpp的內容基本和LuaTutorial1.cpp ...


上一篇在這  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();
        Point(float a, float b);
        $*
        Point()
        {}
        Point(float a, float b)
        {
            x = a;
            y = b;
        }
        *$
    };

    struct Rectangle
    {
        Point m_min;
        Point m_max;

        float left set get;
        float right set get;
    meta:
        float bottom set get;
        float top set get;
        float area get;
        float getArea();
    all:
        Rectangle(const Point ref min, const Point ref max);
        Rectangle();
    meta:
        Rectangle(const Rectangle ref pt);
        $*
        void set_bottom(float bottom)
        {
            m_min.y = bottom;
        }
        float get_bottom()
        {
            return m_min.y;
        }
        void set_top(float top)
        {
            m_max.y = top;
        }
        float get_top()
        {
            return m_max.y;
        }
        float get_area()
        {
            return (m_max.x - m_min.x)*(m_max.y - m_min.y);
        }
        float getArea()
        {
            return (m_max.x - m_min.x)*(m_max.y - m_min.y);
        }
        *$
    };
    $*
    inline Rectangle::Rectangle(const Point& min, const Point& max) : m_min(min), m_max(max)
    {
    }
    inline Rectangle::Rectangle()
    {}
    inline float Rectangle::get_left()
    {
        return m_min.x;
    }
    inline void Rectangle::set_left(float left)
    {
        m_min.x = left;
    }
    inline float Rectangle::get_right()
    {
        return m_max.x;
    }
    inline void Rectangle::set_right(float right)
    {
        m_max.x = right;
    }
    *$
}

在這裡仍然有 struct Point

與LuaTutorial1中的struct Point相比,除了原來的預設構造函數外,多了一個帶兩個參數的構造函數

Point(float a, float b);

兩個構造函數都在meta: 段中,所以idlcpp不會在Tutorial2.h中生成對應的函數聲明,所在直接在後面的$**$寫上構造函數的實現代碼,這些代碼會插入到Tutorial2.h中的對應位置。當然也可以不使用meta:,這樣的話這兩個構造函數的聲明部分就會出現在Tutorial2.h的struct Point中,那麼實現代碼就要寫在外面了。

在struct Point後添加了一個新的類型struct Rectangle

前兩行

Point m_min;

Point m_max;

聲明瞭兩個數據成員。

然後是

float left set get;

float right set get;

這裡又出現了新的語法:屬性。屬性語法來自於C#。

形式為: 類型 + 名稱 + 可選的set和get。在C++中實際上是生成了兩個對應的成員函數,函數名分別為set_ + 屬性名稱,get_ + 屬性名稱,比如為屬性left生成的兩個成員函數為:

void set_left(float) 和 float get_left()。

然後還有三個屬性的聲明

float bottom set get;

float top set get;

float area get;

其中屬性area是只讀屬性,即只生成float get_area()成員函數。

然後是

float getArea();

這是一個成員函數,在C++生成中的函數形式和這裡是一樣的。

 然後是

Rectangle(const Point ref min, const Point ref max);

這是一個構造函數,這裡出現了一個新的關鍵字ref。

關鍵字ref也來自於C#,相當於C++中函數參數聲明中的&。

類似的還有一個關鍵字ptr,相當於C++中函數參數聲明中的*。

之所以使用ref而不是& 是因為指針的緣故。在C++中指針的用法比較自由,在idlcpp中對指針的使用做了一定的限制,考慮到其中的差異,避免在移植現有C++代碼到idl中出現遺漏,決定採用ptr代替*,為了看起來統一,同樣也用ref取代了&。所以此處對應的C++代碼為

Rectangle(const Point& min,const Point& max);

後面就是具體函數的實現代碼。都放在$**$中以便複製到頭文件中。

 編譯後生成的Tutorial2.h的內容如下:

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

#pragma once

#include "./Tutorial2.h"
namespace tutorial{ struct Rectangle; }

namespace tutorial
{
    struct Point
    {
    public:

        float x;
        float y;
    public:
        static Point* New();
        static Point* New(float a,float b);
        static Point* NewArray(unsigned int count);


        Point()
        {}
        Point(float a, float b)
        {
            x = a;
            y = b;
        }
        
    };

    struct Rectangle
    {
    public:

        Point m_min;
        Point m_max;

        void set_left( float);
        float get_left();
        void set_right( float);
        float get_right();

        Rectangle(const Point& min,const Point& max);
        Rectangle();
    public:
        static Rectangle* New(const Point& min,const Point& max);
        static Rectangle* New();
        static Rectangle* NewArray(unsigned int count);
        static Rectangle* Clone(const Rectangle& pt);


        void set_bottom(float bottom)
        {
            m_min.y = bottom;
        }
        float get_bottom()
        {
            return m_min.y;
        }
        void set_top(float top)
        {
            m_max.y = top;
        }
        float get_top()
        {
            return m_max.y;
        }
        float get_area()
        {
            return (m_max.x - m_min.x)*(m_max.y - m_min.y);
        }
        float getArea()
        {
            return (m_max.x - m_min.x)*(m_max.y - m_min.y);
        }
        
    };

    inline Rectangle::Rectangle(const Point& min, const Point& max) : m_min(min), m_max(max)
    {
    }
    inline Rectangle::Rectangle()
    {}
    inline float Rectangle::get_left()
    {
        return m_min.x;
    }
    inline void Rectangle::set_left(float left)
    {
        m_min.x = left;
    }
    inline float Rectangle::get_right()
    {
        return m_max.x;
    }
    inline void Rectangle::set_right(float right)
    {
        m_max.x = right;
    }
    
}

內容基本上都是和Tutorial2.i中一一對應的,在Point和Rectangle中各有幾個靜態函數,名字如下:New,Clone,NewArray。這些都是根據構造函數的形式生成的。這些函數的實現代碼在Tutorial2.ic中。

編譯後生成的Tutorial2.ic的內容如下:

 

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

#pragma once

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

namespace tutorial
{

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

    inline Point* Point::New(float a,float b)
    {
        return new Point(a, b);
    }

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

    inline Rectangle* Rectangle::New(const Point& min,const Point& max)
    {
        return new Rectangle(min, max);
    }

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

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

    inline Rectangle* Rectangle::Clone(const Rectangle& pt)
    {
        return new Rectangle(pt);
    }

}

 

然後看一下腳本tutorial2.lua的內容:

 

rect1 = paf.tutorial.Rectangle();
rect1.m_min.x = 1;
rect1.m_min.y = 2;

print(rect1.left._);
print(rect1.bottom._);

rect1.right = 3;
rect1.top = 4;

print(rect1.m_max.x._);
print(rect1.m_max.y._);

print(rect1.area._);

rect2 = paf.tutorial.Rectangle(rect1.m_min, paf.tutorial.Point(5,5));
print(rect2:getArea()._);

rect3 = paf.tutorial.Rectangle.Clone(rect2);
print(rect3:getArea()._);

.

 

rect1 = paf.tutorial.Rectangle();

這是rect1 = paf.tutorial.Rectangle.New(); 的簡化寫法。

後面分別用數據成員和屬性來操作rect1。

rect2 = paf.tutorial.Rectangle(rect1.m_min, paf.tutorial.Point(5,5));

調用了Rectangle帶參數的構造函數(實際上是靜態函數New)。

rect3 = paf.tutorial.Rectangle.Clone(rect2);

相當於C++中的 Rectangle* rect3 = new Rectangle(*rect2);

或者這一句可以利用lua的語法特點簡寫為 rect3 = rect2:Clone();

編譯運行結果如下圖:

 

 

 

 

C++混合編程之idlcpp教程(一)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 說明:找到最大的數,排列到最後面,然後繼續找 例: $arr = array(3,5,-1,0,2); for($i=0;$i<count($arr)-1;$i++){ for($j=0;$j<count($arr)-1-$i;$j++){ if($arr[$j]>$arr[$j+1]){ $tem ...
  • 漢字字元的編碼為雙位元組,對於漢字字元和單位元組字元混排的情況,如果目標截取的字元串內只包含奇數個單位元組字元,則會出現半個漢字字元的問題。如下所示: (1)天水市秦州區南郭路2號(工行七里墩分理處? --包含數字字元,單位元組。 (2)七里河區金港城金福花園20號樓3號(金港城?--包含數字字元,單位元組。 ...
  • 一元運算符: 二元運算符 三元運算符 ...
  • CSRF(Cross Site Request Forgery, 跨站域請求偽造) CSRF 背景與介紹 CSRF(Cross Site Request Forgery, 跨站域請求偽造)是一種網路的攻擊方式,它在 2007 年曾被列為互聯網 20 大安全隱患之一。其他安全隱患,比如 SQL 腳本註 ...
  • 為什麼要用封裝 安全 方便 降低耦合封裝的步驟:1.將屬性變為private修飾2.寫封裝的方法 public void setXxx(參數){ //根據處理邏輯給屬性賦值 } public 屬性類型 getXxx(){ //return 屬性值 }訪問修飾符 一個.java文件可以定義多個clas ...
  • 1.記事本開發一個Java程式 編寫源程式 源程式以.java為尾碼名 編譯 javac 編譯後生成的文件以.class為尾碼名 運行 java 運行編譯後生成的.class文件2.java程式框架public class Hello{ public static void main(String[ ...
  • maven出現後,很多公司會用maven來構建項目,單僅僅只是單項目單工程的 並沒有使用多工程來構建,這樣在以後,項目越來越大,業務越來越多以後,項目會難以維護,越發龐大,維護成本提高,團隊士氣也會下降 等等情況,使用maven構建多工程就是如今的趨勢 這邊演示一個maven工程相互依賴的例子,高手 ...
  • 簡介 前段時間寫的java設計模式--代理模式,最近在看Spring Aop的時候,覺得於代理模式應該有密切的聯繫,於是決定瞭解下Spring Aop的實現原理。 說起AOP就不得不說下OOP了,OOP中引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行為的一個集合。但是,如果我們需 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...