2014-07-02 48 views
0

我使用tolua ++將C++類型自動公開給Lua。看來,當我暴露某種類型,例如創建某個用戶類型的新實例

struct TestComponent 
{ 
    float foo; 
    string bar; 
} 

什麼tolua做(至少這是它似乎像我)是添加一個新的元表到Lua環境(在這種情況下,它只是被稱爲TestComponent)與一些正規元方法,如__add__lt以及__index,__newindex等。它還有一些自定義函數(稱爲.set.get),當您獲取或設置struct/class的某些成員時,似乎會使用這些自定義函數。這裏的TestComponent的類型似乎只是「表」。

然而,對於如上所述的簡單結構定義,似乎缺少的是用於創建類型爲TestComponent的新實例的功能/方法,例如,

a = TestComponent:new() 

問題是,我該如何創建這種類型的新實例並將其分配給一個變量?例如,將它交給一個函數,該函數需要一個類型爲TestComponent的參數。

回答

0

它已經,因爲我用tolua ++幾年,但基於它看來,如果你的結構有一個構造函數,那麼你可以用a = TestComponent()a = TestComponent:new()(兩者都應該工作,除非你有一箇舊版本創建對象的文檔tolua ++)。如果沒有C++結構體中的構造函數,文檔不會說,但根據您的說法,似乎TestComponent變成了具有給定字段和關聯值的常規表對象,在這種情況下,它沒有任何意義一個構造函數(表是對象,你不能創建它的多個實例)。

所以,如果你可以編輯結構的C++頭添加一個構造函數,它可能會工作。如果你不能做到這一點,那麼你可以定義構造自己(注:未測試):

function TestComponent:new() 
    local obj = {} 
    for k,v in pairs(self) do 
     obj[k] = v 
    setmetatable(obj, self) 
    return obj 
end 

您可能需要篩選鍵,以便你只能得到值(不是函數,例如),或用明確的分配替換回路,例如:

function TestComponent:new() 
    local obj = {} 
    obj.foo = self.foo 
    obj.bar = self.bar 
    setmetatable(obj, self) 
    return obj 
end 
相關問題