2013-01-17 74 views
2

我遇到了綁定C++和Lua的問題。 我已經實現在Lua一個簡單的類系統,這讓我能夠從使用訪問C++中的lua類函數

m_newObj:functionname(parameter) 
使用

require 'classname' 
m_newObj = classname() --"classname() creates a new instance 

然後我可以在m_newObj訪問功能的另一個LUA文件創建一個Lua類的「實例」

這很好,但我希望能夠從C++代碼訪問lua類的實例。

通常情況下,你可以創建訪問Lua函數在C++中使用

lua_State* pL = luaL_newState(); 
... 
lua_getglobal(pL, "functionName"); 
lua_call(pL,0,0); 

但這隻有在一個luafile調用一個函數,它不調用的「類」的一個具體實例特定的功能。

所以基本上我想要做的就是

  • 得到在C LUA類++
  • 通話功能的一個實例的具體實例訪問

爲什麼我想這樣做的原因這是因爲我發現在性能上它需要更多的使用lua中的C++函數,而不是使用C++中的lua函數,所以爲了能夠使用lua擴展實體而不需要使用lua代碼調用很多C++函數需要用C++來訪問lua類在lua中獲得對C++類的訪問權限。

+0

「*在性能上它需要更多的使用C++函數在Lua比下使用Lua函數++ *」你分析你用它來確定呢?據我所知,兩種語言之間的編組工作方式都是一樣的。當然,這取決於你如何將你的C函數附加到Lua。 –

回答

2

把你的班級推到棧上,lua_getfield()這個功能,然後在調用該功能之前將你的班級複製回棧頂。事情是這樣的:

int nresults = 1;     // number of results from your Lua function 

lua_getglobal(L, "classname"); 
lua_getfield(L, -1, "funcname"); 
lua_pushvalue(L, -2);    // push a copy of the class to the top of the stack 
lua_call(L, 1, nresults);   // equivalent to classname.funcname(classname) 
+0

對不起,這是我正在尋找的答案!謝謝! – leafblight

2
m_newObj:functionname(parameter) 

這是syntactic sugar for this

m_newObj.functionname(m_newObj, parameter) 

所以才做了相當於從你的C++代碼。