【问题标题】:accessing lua class functions in C++在 C++ 中访问 lua 类函数
【发布时间】:2013-01-17 17:41:08
【问题描述】:

我遇到了绑定 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++ 类。

【问题讨论】:

  • "在性能方面,在 lua 中使用 C++ 函数比在 C++ 中使用 lua 函数要求更多" 您使用什么分析来确定这一点?据我了解,两种语言之间的编组工作方式相同。当然取决于您如何将 C 函数附加到 Lua。

标签: c++ oop lua


【解决方案1】:

将您的类推入堆栈,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)

【讨论】:

  • 抱歉消失了,这就是我要找的答案!谢谢!
【解决方案2】:
m_newObj:functionname(parameter)

这是syntactic sugar for this

m_newObj.functionname(m_newObj, parameter)

因此,只需在您的 C++ 代码中执行等效操作即可。

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 2012-10-28
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2021-10-31
    相关资源
    最近更新 更多