2013-04-25 58 views
1

这剪断基本类型的作品:Luabridge:返回C++的寿命管理对象

int CreateBasicObject(lua_State *L) 
{ 
    int ret0; 

    lua_pushinteger(L, ret0); 

    return 1; 
} 

,并在Lua它看起来像这样:

local NewObject=CreateBasicObject() 

我怎么会去恢复类,而不是整数的

push(L,&MyObject); 
return 1; 

似乎没有正常工作,LUA部分看起来是这样的:

self.MyObject=Screen.MyObject(); 

和错误是:

attempt to index field 'MyObject' (a number value) 
+1

你具体问LuaBridge或普通的Lua?对于它的价值,我相信在尝试使用任何第三方绑定解决方案之前,应该尝试使用简单的Lua C API来实现至少一些C++类。这有助于更好地理解这些东西(LuaBridge和类似的东西)的工作原理。 – 2013-04-25 07:48:47

回答

2

newest LuaBridge版本,你可以使用RefCountedPtr例如:

一些C++定义

struct A {}; 

static RefCountedPtr<A> SomeA() { 
return RefCountedPtr<A>(new A); 
} 

和绑定:

luabridge::getGlobalNamespace(L) 
    .beginClass<A>("A") 
    .addConstructor< void (*)(), RefCountedPtr<A> >() 
    .endClass() 

    .addFunction("SomeA",&SomeA); 

现在你可以安全返回A对象并将其传递给其他的Lua绑定功能RefCountedPtr<A>

在Lua那么你可以使用它像:

local a=A() 
--do something with a... 

local b=SomeA() 
--do something with b... 
+0

你好德米特里,这是我们已经使用,但希望C++来管理内存,所以不需要引用计数器指针。任何使用方法创建一个C++生命周期管理对象WITHOUT RefCounterPtr? – Grapes 2013-04-25 12:28:02

+0

嗨,葡萄。你想如何将对象传递给Lua?如果你想在Lua中创建它们,你必须使用RefCountedPtr,如果没有,你可以将它们作为普通的指针或引用传递给它们,只是你应该关心你的C++对象的生命周期是否超过潜在的它形成了Lua的参考。 – 2013-04-25 14:18:50

+0

你好德米特里,我想调用CreateBasicObject()并且返回一个原始的C++指针,它不会被没有RefCounterPtr的lua垃圾收集。那可能吗? – Grapes 2013-04-25 14:53:12