在C++中访问Lua类函数

我在将C ++和Lua绑定时遇到了一个问题。

我在Lua中实现了一个简单的类系统,使我能够从另一个Lua文件创建lua类的“实例”,如下所示:

require 'classname'
m_newObj = classname() --“classname()”创建一个新实例

然后,我可以使用以下语句访问m_newObj中的函数:

m_newObj:functionname(parameter)

这个方法完全符合我的要求,但我希望能够从C ++代码中访问lua类的实例。

通常,您可以使用以下方法在C ++中访问lua函数:

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

但是,这仅仅在lua文件中调用函数,而不是在“类”的特定实例上调用函数。

因此,基本上我想做的是:

  • 在C ++中获取lua类的实例
  • 在特定实例上调用函数

我想这样做的原因是因为我已经发现在性能方面,使用C ++函数在lua中比使用lua函数在C ++中需要更多,所以为了能够使用lua扩展实体但不需要让lua代码调用很多C ++函数,我需要在C ++中获取lua类的访问权限,而不是在lua中获取C ++类的访问权限。

点赞
用户734069
用户734069
`m_newObj:functionname(parameter)`:

这是 [syntactic sugar for this](http://www.lua.org/manual/5.1/manual.html#2.5.8) 的简写方式:

`m_newObj.functionname(m_newObj, parameter)`

因此,只需要在您的 C++ 代码中执行相应的操作。
2013-01-17 17:56:47
用户1516484
用户1516484

将你的类推入堆栈中,从中 lua_getfield() 函数,然后在调用函数之前将你的类复制回堆栈顶部。示例如下:

int nresults = 1;                  // Lua 函数返回的结果数

lua_getglobal(L, "classname");
lua_getfield(L, -1, "funcname");
lua_pushvalue(L, -2);              // 将类的副本推入堆栈顶部
lua_call(L, 1, nresults);          // 相当于 classname.funcname(classname)
2013-01-17 19:29:05