在C ++中访问lua类函数

时间:2013-01-17 17:41:09

标签: c++ oop lua

我遇到了绑定C ++和Lua的问题。 我在Lua中实现了一个简单的类系统,这使我能够使用

从另一个lua文件创建一个lua类的“实例”
require 'classname'
m_newObj = classname() --"classname() creates a new instance

然后我可以使用

访问m_newObj中的函数
m_newObj:functionname(parameter)

这很好用,但我希望能够从C ++代码访问lua类的实例。

通常,您可以使用

在C ++中创建对lua函数的访问
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 ++类。

2 个答案:

答案 0 :(得分:2)

m_newObj:functionname(parameter)

这是syntactic sugar for this

m_newObj.functionname(m_newObj, parameter)

所以只需从C ++代码中执行相同的操作。

答案 1 :(得分: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)