gengyong/luaaa

是否可以将C++对象指针或引用,传入Lua层进行调用,而非Lua创建C++对象

jphz opened this issue · 2 comments

jphz commented

如题

可以。可以通过定义构造方法来改变默认内存管理方式:

LuaClass<SingletonWorld> luaWorld(L, "SingletonWorld");
/// use class constructor as instance spawner, default destructor will be called from gc.
luaWorld.ctor();

/// use static function as instance spawner, default destructor will be called from gc.
luaWorld.ctor("newInstance", &SingletonWorld::newInstance);

/// use static function as instance spawner and static function as delete function which be called from gc.
luaWorld.ctor("managedInstance", &SingletonWorld::newInstance , &SingletonWorld::delInstance);

/// for singleton pattern, set deleter(gc) to nullptr to avoid singleton instance be destroyed.
luaWorld.ctor("getInstance", &SingletonWorld::getInstance, nullptr);

按你所述需求,你可以在ctor参数中传入一个静态方法, 在该方法中按需要返回对象指针。
默认情况下,这个对象的生存期将由lua管理,在 lua 执行垃圾回收的时候,会调用该对象的默认析构函数。如果默认析构不是你需要的,你可以在 ctor 中传入第二个方法,这个方法会在lua对该对象执行垃圾回收时调用。
另外针对singleton这种常用的设计模式,或者如果你决定该对象的生存期全程由c++管理, 你可以简单的将第二个方法设置为nullptr, 这样 lua 的垃圾回收就不会对该对象起作用。

jphz commented

谢谢,我知道该怎么做了。