簡體   English   中英

將成員函數添加到綁定到Lua的C ++類中

[英]Adding member function to a C++ class bound to Lua

我一直在研究如何將C ++類綁定到Lua以便在游戲引擎中使用,並且遇到了一個有趣的問題。 我一直在以下網站上關注該教程: http : //tinyurl.com/d8wdmea 學習完本教程后,我意識到他建議使用以下代碼:

local badguy = Monster.create();
badguy.pounce = function(self, howhigh, bonus)
    self.jumpbonus = bonus or 2;
    self:jump(howhigh);
    self:rawr();
end
badguy:pounce(5, 1);

只會將pounce函數添加到Monster的特定實例。 因此,我將他建議的腳本更改為以下內容:

function Monster:pounce(howhigh, bonus)
    print("in pounce function");
    print(bonus);
    self.jumpbonus = bonus or 2
    self:jump(howhigh);
    self:rawr();
end
local badguy = Monster.create();
badguy:pounce(5,1);

但是,當我調用pounce函數時,腳本會中斷。 經過進一步測試后,我能夠成功調用pounce函數的唯一方法是通過將該函數作為Monster類的靜態成員進行調用(該函數的代碼保持不變):

Monster.pounce(badguy,5,1);

語法上,badguy:pounce(5,1)是正確的,但沒有正確調用該函數。 我是在做錯什么,還是lua和c ++之間的綁定限制/我如何綁定這兩種語言?

我理解這個問題,並且可能對解決方案有所了解。 從技術上講,lua Monster'class'和C ++ Monster class之間沒有鏈接。 在給定的lua對象上調用lua'成員函數'時,它不了解C ++中的特定Monster對象。 如果要調用C ++對象的非靜態方法,則不能使用lua C函數來執行此操作。 您可能需要將用戶數據附加到lua對象的某個地方,該對象具有指向C ++對象的指針(對對象生存期要非常小心-您必須使用完整用戶數據,並使用銷毀C函數的函數覆蓋lua中的__gc C ++對象)。 在這種情況下,可以在需要該用戶數據的Monster類上聲明一個私有的靜態C ++方法,然后強制轉換指針並使用給定的參數為此特定C ++ Monster對象調用非靜態成員函數。 (希望我能理解您的問題,並且我的回答寫得足夠清楚。)

當你寫

function Monster:pounce(howhigh, bonus)

這是

Monster.pounce = function(self, howhigh, bonus)

所以顯然是這樣稱呼的

Monster.pounce(badguy, 5, 1);

如你所做的那樣。

但是,您想做一些不同的事情:從C ++模塊中,獲得一個名為Monster的表。 您不想操作此表本身,因為它(僅?)包含名為create的條目, monster的構造函數。

我必須承認,我並沒有完全獲得鏈接到的代碼,但是假設一個metatable訪問一個Monster的方法,則可以在該metatable中插入pounce方法。

不能直接使用其所有參數調用C對象/函數。 您必須將C函數注冊到Lua狀態。 該函數必須這樣看:

static int myfunc (lua_State *L) {
  // your code
  return X;  /* X = number of results */
}

該函數僅接收Lua-State作為參數。 Luafunction調用的所有參數都放在lua堆棧上。 然后,您必須從堆棧中彈出並使用它調用C ++方法。

函數的注冊非常簡單,只需兩行代碼即可完成:

lua_pushcfunction(l, myfunc);
lua_setglobal(l, "myfuncnameinlua");

您可以在《 lua編程 》一書的這一章中找到有關信息的更多信息。

要實現Lua對象,您要做的事情有些復雜,因為您必須注冊一個元表才能創建Lua對象,但是Lua to C接口仍然是上述功能。

您還可以在Roberto Ierusalimschy在第28章的書中傾向於實現Lua-Object。

我希望這能幫到您

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM