2011-09-03 27 views
0

我有一個關於使用LuaPlus的初學者問題。LuaPlus中的C++對象

我在這裏看一些代碼的對象構造器中:

m_MetaTable = g_pApp->m_pLuaStateManager->GetGlobalState()->GetGlobals().CreateTable("EventManager"); 
m_MetaTable.SetObject("__index", m_MetaTable); 

m_MetaTable.RegisterObjectDirect("TriggerEvent", (EventManager *)0, &EventManager::TriggerEventFromScript); 
m_MetaTable.RegisterObjectDirect("RegisterEventType", (EventManager *)0, &EventManager::RegisterScriptEventType); 
m_MetaTable.RegisterObjectDirect("AddScriptListener", (EventManager *)0, &EventManager::AddScriptListener); 
m_MetaTable.RegisterObjectDirect("RemoveScriptListener", (EventManager *)0, &EventManager::RemoveScriptListener); 
m_MetaTable.RegisterObjectDirect("AddScriptActorListener", (EventManager *)0, &EventManager::AddScriptActorListener); 
m_MetaTable.RegisterObjectDirect("RemoveScriptActorListener", (EventManager *)0, &EventManager::RemoveScriptActorListener); 

LuaPlus::LuaObject luaStateManObj = g_pApp->m_pLuaStateManager->GetGlobalState()->BoxPointer(this); 
luaStateManObj.SetMetaTable(m_MetaTable); 
g_pApp->m_pLuaStateManager->GetGlobalState()->GetGlobals().SetObject("EventManager", luaStateManObj); 

首先我們創建一個元表設置其__index等於元表本身和一些C++函數與表中的條目相關聯。現在任何使用這個metatable的表都應該「繼承」這些函數,如果我正確地理解這個。

我不明白的部分是最後3行代碼。看起來我們創建了一個LuaObject,然後使用這個指針將它與C++對象相關聯,將它的metatable設置爲與上面相同,然後創建一個全局Lua變量,以便可以通過Lua腳本訪問它。

如果任何使用上述metatable的表已經可以訪問C++成員函數,那麼這麼做的目的是什麼?

回答

0

我不知道那是什麼交代不清你的一部分,但在這裏不用我的每一行

LuaPlus::LuaObject luaStateManObj = g_pApp->m_pLuaStateManager->GetGlobalState()->BoxPointer(this); 

此行是創建一個包裝了C++指針LUA對象的理解。這個對象存在於lua中,但就運行時而言,這是一個無名稱的對象,所以你不能從lua端訪問它。

luaStateManObj.SetMetaTable(m_MetaTable); 

非常明顯,只需將您之前創建的metatable設置爲剛剛創建的對象即可。

g_pApp->m_pLuaStateManager->GetGlobalState()->GetGlobals().SetObject("EventManager", luaStateManObj); 

在這裏,您將爲您創建的lua對象創建一個「lua名稱」,以便您可以從腳本端訪問它。在這一行之後,如果您執行一個調用名爲「EventManager」的對象的lua腳本,它將引用您在此處指定的對象。在這行之前,lua中沒有任何綁定到「EventManager」名稱的對象(假設之前沒有人定義過)。