[英]Passing existing C++ objects to Lua and calling the passed objects' member functions
我正在研究一個小的仿真項目,該項目使用Lua來驅動各個單元(螞蟻)的行為,並使用Luabind將C ++和Lua的面粘合在一起。 每個單獨的ant(有不同的類型,從基類Ant派生而來)都有一個Run()函數,該函數調用相應的腳本。 然后,腳本執行需要采取的任何操作,調用公開的類函數,並可能調用自由函數。 我已經獲得了Run函數(在C ++中),可以在Lua腳本中成功執行匹配的Run函數(此刻該腳本僅打印一些文本)。
void AntQueen::Run()
{
lua->GetObject("QueenRun")(GetID());
}
lua
只是一個管理器類,它從腳本中檢索函數。 上面在Lua文件中調用了以下內容:
function QueenRun(ID)
print("The Queen is running!")
print(ID)
end
Luabind的AntQueen類注冊如下:
void Register(lua_State *luaState)
{
using namespace luabind;
module(luaState)
[
class_<AntQueen, Ant>("AntQueen")
.def("Eat", &AntQueen::Eat)
.def("ExtractLarvae", &AntQueen::ExtractLarvae)
.def("GetMaxLarvaeProduced", &AntQueen::GetMaxLarvaeProduced)
.def("GetNumAvailLarvae", &AntQueen::GetNumAvailLarvae)
];
}
現在,通過簡單的工廠/經理來創建,刪除和發現螞蟻,這是它的設置方式。 可以通過調用static Ant* AntFactory::GetAntByID(const int ID)
來檢索每個螞蟻,后者僅在哈希映射中找到該螞蟻並返回指向該螞蟻的指針。 我想要做的是讓Lua能夠執行以下操作:
function QueenRun(ID)
ant = GetAntByID(ID)
larvae = ant:GetNumAvailLarvae()
print(larvae)
ant:Eat()
end
上面只是一個虛構的示例,但希望它可以顯示我正在嘗試實現的目標。 我不希望Lua垃圾收集對象,因為它們已經在C ++端進行了管理。 測試所有內容時,請嘗試執行以下操作:
ant = GetAntByID(ID)
在Lua中導致調用abort()
並使程序崩潰並刻錄。
R6010
-abort() has been called
我似乎在所有事物來回往返方面都缺少一些東西(這是我第一次嘗試將Lua和C ++粘合在一起,而不是玩具程序)。 我很確定傳遞普通指針不是做到這一點的方法。 lightuserdata似乎是我要尋找的東西,但它也有很多限制。
綜上所述:發生了什么事情,導致abort
被調用,如何使用Luabind / Lua C API獲取指向傳遞給Lua的C ++對象的指針,並對該指針調用成員函數,就好像它是對象(不讓Lua垃圾收集它)?
這個問題的解決方案似乎與AntFactory類/成員函數是靜態的有關。 一旦我停止注冊並使用它:
//C++
static int AntFactory::CreateAnt(foo, bar)
{}
//Lua
factory:CreateAnt(foo, bar)
實例化對象和常規成員函數,如下所示:
//C++
int AntFactory::CreateAnt(foo, bar)
{}
//Lua
factory:CreateAnt(foo, bar)
一切工作都沒有問題(在將工廠推向全球市場之后)。 我認為這樣做的原因是,由於Lua(或Luabind?)無法讓對象查詢調用,因此試圖在未實例化的C ++對象上調用靜態成員函數失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.