egmkang 服务端开发工程师

让Lua虚拟机托管C++ 对象

2015-08-20

以前做端游的时候,我们的前辈封装了C++ 和Lua的交互,其中有一个地方就是C++ 对象让Lua虚拟机托管.搞得比较复杂,我都忘了他们当时怎么搞的.之后基本上没再碰过lua,主要原因还是对象生命周期的问题.有时候需要一些对象在C++ 里面创建,然后又不是C++ 来控制其生命(最好让lua虚拟机控制其生命周期).

前些日子没事干,看到LuaBridge,封装的还不错, 双向交互都有.最关键有一个混合模式的生命周期管理.通过这个你可以把对象在C++ 和Lua之间传递过来传递过去, 不会发生内存管理问题.

class ScriptObject : public RefCountedObject {
  public:
    ScriptObject() : RefCountedObject() { }

    void Foo() {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};

int main() {
  lua_State *L = luaL_newstate();
  luaL_openlibs(L);
  luabridge::getGlobalNamespace(L)
    .beginClass<ScriptObject>("ScriptObject")
      .addConstructor<void (*)(), RefCountedPtr<ScriptObject> >()
      .addFunction("Foo", &ScriptObject::Foo)
    .endClass();

  //这样你就可以把ScriptObject传递给Lua
  //参数类型写RefCountedPtr<ScriptObject>就行了
  lua_close(L);
}

上一篇 浪费生命

下一篇 并发连接MySQL

Comments