我有一個包裹着swig的類,並且註冊了lua。我可以在lua腳本中創建這個類的一個實例,並且它一切正常。如何將用swig包裝的C++類的實例推送到lua堆棧上?
但是說我有一個在我的C++代碼中創建的類的實例,調用了新的X,並且我有la lua_state L,它帶有一個我想要調用的函數,它接受一個參數, X ...我如何調用該功能。這是有問題(我省略了錯誤處理的東西)的代碼(部分):
的main.cpp
class GuiInst;
extern "C"
{
int luaopen_engine (lua_State *L);
}
int main()
{
GuiInst gui=new GuiInst;
lua_State *L=luaL_newstate();
luaopen_engine(L); //this is swigs module
int error=luaL_loadfile(L,"mainmenu.lua")||
lua_pcall(L, 0, 0, 0);
lua_getglobal(L,"Init");
//Somehow push gui onto lua stack...
lua_pcall(L, 1, 0, 0));
lua_close(L);
}
mainmenu.lua
function Init(gui)
vregion=gui:CreateComponent("GuiRegionVertical");
end
此刻所有我已經發現可以工作的是從swig生成的cpp文件中公開一些功能,並調用它。這有幾個原因是不好的......如果我有多個模塊,我不得不改變swig文件中的默認鏈接規範(使用-DSWIGRUNTIME =)。
我添加以下內容的main.cpp
extern "C"
{
struct swig_module_info;
struct swig_type_info;
int luaopen_engine (lua_State *L);
swig_module_info *SWIG_Lua_GetModule(lua_State* L);
void SWIG_Lua_NewPointerObj(lua_State* L,void* ptr,swig_type_info *type, int own);
swig_type_info *SWIG_TypeQueryModule(swig_module_info *start,swig_module_info *end,const char *name);
}
//and then to push the value...
SWIG_Lua_NewPointerObj(L,gui,SWIG_TypeQueryModule(SWIG_Lua_GetModule(L),SWIG_Lua_GetModule(L),"GuiInst *"),0);
那得到一個指向模塊,那麼指針類型,然後調用函數swigs註冊它。不得不挖掘一個本不應該是人類可讀的文件是非常不合理的(所以它在文件的頂部說明)並且只是MESSY! (但它確實有用!)
當然,這是一種更好的方式來完成我想要做的事情。
PS從高級pov我想要的是讓lua不會引用GuiInst中的Object Factory創建的Gui組件,以防萬一我錯了。這是我第一次將功能暴露給一些非常簡單的(和非swig)Python模塊的腳本語言,所以我準備好接受建議。
感謝您的任何建議!
響應由RBerteig
痛飲時運行,以防止LUA構建它的實例,這樣就不會爲我工作GuiInst的構造器已經#defined私人評論。我試圖阻止了以下內容(LUA):
r=engine.GuiRegionVertical()
r:Add(engine.GuiButton())
其稱之爲「G =新GuiButton」,則與GuiRegionVertical(這需要存儲各種原因指針)進行註冊,然後調用「刪除g」,GuiRegionVertical留下一個指向g的懸掛指針。我想懷疑真正需要發生的是GuiRegionVertical :: Add(GuiButton *)應該增加GuiButton *的引用計數,然後GuiRegionVertical的析構函數應該減少其所有內容的refcounts,儘管我並不是確定這應該如何用swig來完成。
這將消除對私有構造函數,Gui對象工廠和令人討厭的extern的需求。
我該怎麼處理這個錯誤?
謝謝。
可能重複[SWIG:Lua - 將C++實例作爲lua函數參數傳遞](http://stackoverflow.com/questions/9455552/swiglua-passing-ac-instance-as-a-lua-function-參數) – 2012-03-02 02:51:26
@NicolBolas:這個問題怎麼可能是重複的?它比那個年長三歲:)。感謝鏈接壽。 – DaedalusFall 2012-04-10 13:28:47