在Lua中创建和访问Lua对象,该对象存储在C ++程序中

时间:2015-07-19 07:50:47

标签: c++ object lua

也许我在Google搜索方面表现不佳,也许我会过度思考问题,但如果我有这个Lua课程:

--Foo:
Foo = {number = 0}
function Foo.setNumber(newNumber)
    number = newNumber
end

如果我尝试在另一个.lua文件中使用此类,则在文件结束后,该对象将被销毁。我使用Lua(like here)看到的其他教程假设C ++程序已经知道了类,因此它被定义为普通的C ++类。然而,就我而言,Lua的观点是C ++程序只是一个处理绘图等的框架,因此不能将Lua类硬编码到程序中。

所以,我的问题是,如何使用Lua定义和保存Lua对象,但除非我明确告诉它,否则对象不会被破坏?我正在考虑用C ++创建一个存储Lua对象的向量/映射的类,然后Lua脚本可以使用公开的函数请求对象。不幸的是,听起来很慢,因为Lua要执行一个函数,它需要从C ++接收类的副本,调用类的函数,然后将其发送回C ++,以覆盖前一个副本。

以下是一些代码,这些代码是根据Elias Daler's教程修改的,我们是如何运行Lua脚本的(这是非常好的IMO):

#include <lua.hpp>
#include <LuaBridge.h>

#include <string>

//Example class to expose (I realise it's very similar to Foo):
class Bar
{
    private:
        std::string string;

    public:
        void setString(const std::string& newString) {string = newString;}
}

int main()
{
    //Expose the API:
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    luabridge::getGlobalNamespace(L)
    .beginClass<Bar>("Bar")
        .addConstructor<void(*)(void)>()
        .addFunction("setString", &Foo::setString)
    .endClass();

    //Run the script:
    luaL_dofile(L, "script.lua");
    luaL_openlibs(L);
    lua_pcall(L, 0, 0, 0);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

在Lua中,所有全局变量都存储在全局表 _G (称为environment)中。除非有人明确地修改它,否则只有在Lua state被销毁时才会销毁它。

因此,您可以使用以下命令运行第二个脚本:

luaL_dofile(L, "another_script.lua");

它应该看到第一个脚本留下的全局变量,因为脚本使用与第一个脚本相同的Lua状态。

答案 1 :(得分:1)

Lua通过垃圾收集管理自己的生命周期。如果它看不到使用的对象,它将破坏它。诀窍是将这些对象存储在lua表中,c ++添加并删除它们,控制它们的生命周期。