将非全局C ++对象传递给Lua函数(Swig)

时间:2010-03-07 07:22:32

标签: c++ lua swig

我正在使用lua扩展一个接口,我遇到了一个问题,我需要将对象的指针传递给lua代码才能工作。这些类将通过SWIG封装,我可以使用swig通过lua实例化它们,但这会让我无用的对象。

我需要能够将回调对象传递给lua,以及表示事件上事物的对象。我不能手动将回调定义为全局,因为这会引入一个不可接受的约束。

所以对于一个通用的例子,给定一个类C和一个带有1个参数的lua函数,如何在传递类型C的C ++指针时调用该lua函数?

2 个答案:

答案 0 :(得分:3)

啊哈,回答我自己的问题,但我找到了它!

http://lua-users.org/lists/lua-l/2007-05/msg00053.html

  

Hello Joey,

     

我几乎完成了所有SWIG-LUA的工作   卢安方面。 Swig非常适合   只需将C / C ++库包装起来   让它可以被lua读取。获得   与lua交谈的C ++相当容易,但是   没有详细记录。

     

你想到lua_pushlightuserdata(),   很接近,但不是。你可能   想要这样的东西:

Foo* p= new Foo();
SWIG_NewPointerObj(L,p,SWIGTYPE_p_Foo,1);
lua_setglobal (L, "p");
     

SWIG_NewPointerObj()创建一个   用户数据(不是lightuserdata)   foo对象&把它推到堆栈。   最后一个参数(在这种情况下为1)是   你是否想要lua来管理   记忆(0表示否,1表示是)。

     

SWIG_NewPointerObj()和   SWIGTYPE_p_Foo都在{。}}中找到   包装文件。

     

一旦你拥有了,你应该能够   在卢阿做:

print(p)
print(swig_type(p))
p:some_function()
     

如果您有任何其他问题,请告诉我   的问题。问候,马克

答案 1 :(得分:0)

我没有将Swig与C ++和Lua一起使用,但你可以通过两种不同的方式(userdata和closures)来实现它。我不知道Swig是否会以某种方式干扰这一点。

Using Userdata

lua_pushcclosure