簡體   English   中英

將現有的C ++對象傳遞給Lua並調用傳遞的對象的成員函數

[英]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.

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