小编chr*_*tte的帖子

luabind:无法调用print,tostring等基本的lua函数

我猜是一个非常基本的问题:

调用lua的C++代码如下所示:

lua_State* m_L;
m_L = lua_open();
luabind::open(m_L);
luaL_dofile(m_L, "test.lua");
try {
    luabind::call_function<void>(m_L, "main");
} catch (luabind::error& e) {
    std::string error = lua_tostring(e.state(), -1);
    std::cout << error << std::endl;
}
lua_close(m_L);
Run Code Online (Sandbox Code Playgroud)

现在test.lua具有以下内容:

function main()
print "1"
end
Run Code Online (Sandbox Code Playgroud)

执行后,我收到错误:

test.lua:2: attempt to call global 'print' (a nil value)
Run Code Online (Sandbox Code Playgroud)

问题是什么?它与环境有关吗?我认为像print这样的函数是在全局环境中定义的.那为什么没找到?

非常感谢你.

c++ environment lua luabind

5
推荐指数
1
解决办法
1277
查看次数

模板类的静态成员变量的隐式初始化

目前我正在开发一个C++项目,我打算在其中嵌入Lua脚本.因此,某些类需要导出到Lua,我想让它更方便,因此我创建了一个模板类:

template <class T>
class ExportToLua {
    public:
        ExportToLua() {}
        ~ExportToLua() {}
    private:
        static int m_registered;
};
template <class T> int ExportToLua<T>::m_registered = T::exportToLua();
Run Code Online (Sandbox Code Playgroud)

现在每一个需要导出类源自ExportToLua<T>与T="之类要导出".例:

 class Example: public ExportToLua<Example> {
 public:
     Example();
     virtual ~Example();
     static int exportToLua();
 private:
 };
Run Code Online (Sandbox Code Playgroud)

Example静态成员函数在哪里exportToLua()保存特定于类的注册码.我的理解是ExportToLua<T>::m_registered每个编译单元都存在一个静态成员变量的实例- 即每个编译单元T.

但是当我启动我的程序时,注册码永远不会被调用.例如在example.cpp中:

 int Example::exportToLua() {
     std::cout << "int Example::exportToLua()" << std::endl;
     return -2;
 }
Run Code Online (Sandbox Code Playgroud)

但是,当我运行程序时,我从未看到此消息.

知道为什么吗?编译器是否"优化了"静态变量m_registered,因为我没有在任何地方使用它?

感谢您的输入,

最好的,克里斯托弗

c++ inheritance templates static-members

5
推荐指数
1
解决办法
2216
查看次数

lua - 类析构函数的延迟调用

我正在研究一个基本上只执行lua脚本的c ++程序.在那个lua脚本中,然而构造了类,这些类已经从我的c ++程序导出到lua脚本.

我的main()c ++函数只是在做了一些准备之后调用了...

    luabind::call_function<void>(m_L, "main");
Run Code Online (Sandbox Code Playgroud)

现在我的lua脚本看起来像这样

local function test()
local c = C()
end

function main()
    for i=1,2 do
        log(i)
        test()
    end
end
Run Code Online (Sandbox Code Playgroud)

我已经包含了一个std :: cout <<"析构函数"<< std :: endl; 在C的析构函数中所以我知道它什么时候被调用.我希望lua的垃圾收集在每次执行test()时都会调用c的析构函数,因为那时它就超出了范围.相反,我看到以下输出:

1
2
destructor
destructor
Run Code Online (Sandbox Code Playgroud)

而不是

1
destructor
2
destructor
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样?我在这里错过了什么吗?

c++ lua garbage-collection destructor

4
推荐指数
1
解决办法
704
查看次数