2013-12-11 58 views
4

我是Lua的新手,並試圖理解一些基礎知識。我想了解的是將Lua綁定到C++實例。從零開始的Lua/C++綁定

我不感興趣的第三方庫,我想在一個更根本的層面來理解這一點 - 謝謝:)

這裏是我的問題:

  1. 我根據我讀的假設,Lua只能綁定到靜態C函數。它是否正確?
  2. 這是否意味着要綁定一個C++類的實例,我首先需要爲每個方法和屬性getter/setter編寫靜態函數,並接受一個實例指針作爲參數。
  3. 我會註冊這些函數與Lua。
  4. 我會給Lua一個指向C++類實例的指針。
  5. 從Lua我會調用其中一個註冊函數,傳遞C++實例指針。
  6. 靜態函數解引用指針,調用等效方法。

這是否有意義?還是我得到了錯誤?

感謝您閱讀這篇文章。

+0

綁定不同的語言通常是通過一個C接口來完成的(ABI更好地定義了C)。我對lua瞭解細節不夠熟悉,但我的建議是選擇圖書館解決方案。您將重新發明輪子,讓它與現有解決方案一樣圓滿,這可能不是微不足道的。至少,請看看這些庫的功能。 –

+1

謝謝,但我特別想了解Lua的原理,以便我不想(不允許)使用第三方庫的用例。我研究過幾個圖書館,但我只關心這個工作的核心原則,而不能從圖書館那裏瞭解這些(高度抽象的,沉重的閱讀)。 – user1654794

+0

許多利用Lua-C++綁定的第三方庫都是開源的。你總是可以看看他們是如何做的,以瞭解他們。 *儘管如此,警惕虛位以待。 –

回答

5

這是我的盟友。

1)Lua ...它沒有真正地綁定到東西,你需要做的是「和Lua玩好」,這需要了解Lua如何工作。

我真的建議讀http://luaforge.net/docman/83/98/ANoFrillsIntroToLua51VMInstructions.pdf那個。

這會告訴你一切事情Lua實際上能夠做到。所以函數Lua讓你讓你操縱這些結構。

之後,一切都變得更有意義。

爲什麼這個答案應該

您的問題1結束後,這裏都是錯誤的。 1在語義上是錯誤的,一個靜態函數只有內部/弱連接。我猜你的意思是「不是一種方法」

2)不是真的,請記住你有對象(和lua與表/元表)有很好的「自我」/「這個」身份 - 你不綁定到方法。

你希望Lua使用「自我」參數來調用你的某個函數,那個「自我」(不管它是什麼,簡單的整數ID或者是一個void *,如果你覺得危險)應該告訴你什麼ojbect你正在合作。

3/4/5/6沒有什麼意義,讀取該文件中迴應,如果你需要更多的:)評論這個或有更具體的東西,這不是一個壞的問題,順便說一句,它只是幼稚

+0

嗨亞歷克,謝謝你的回答 - 我熟悉Lua如何工作;通過堆棧和表格進行通信以及用於存儲/組織數據的metatables。我想也許這個問題是我關於綁定的術語。我想從Lua調用C++實例上的函數。 「你希望Lua用一種」自我「的觀點來稱呼你的一些功能,那個」自我「應該告訴你你正在合作的是什麼。」是的,確切的 - 那麼如何實現這一點,我應該創建C++靜態函數來接受void *並將其解引用,然後在C++實例上調用等效方法? – user1654794

+1

@ user1654794這取決於你,請記住,如果你真的敢用void *方法,使用dynamic_cast,你會驚訝於糟糕的轉換不會導致崩潰。爲什麼不__查看教程或其他庫的代碼。我就是這樣學習的。 –

+0

好 - 非常感謝亞歷克。我主要擔心的是這種做法不好,或者被人忽視。由於您的回覆,我只是簡單地運行代碼並看到會發生什麼:)更有信心。感謝dynamic_cast提示。測試Lua指針的好主意是正確的類型。 :) 再次感謝! – user1654794