Swig C ++ Lua Pass类引用

时间:2009-08-07 17:34:47

标签: c++ operators lua swig conversion-operator

我不知道为什么我这么难过。我想做的就是:

class foo {

public:
    foo(){}
    ~foo(){}
    float a,b;
};

class foo2 {
public:
     foo2(){}
     foo2(const foo &f){*this = f;}
     ~foo2(){}
     void operator=(const foo& f){
          x = f.a;
          y = f.b;
     }
     float x,y;
};

/* Usage(cpp):

   foo f;
   foo2 f2(f);

   //or using the = operator
   f2 = f;
*/

我遇到的问题是,在浏览了这段代码之后,我无法弄清楚如何让lua脚本发挥得很好。

/* Usage(lua)
   f = example.foo()
   f2 = example.foo2(f) --error
*/

我得到的错误是“重载函数的错误参数'new_Foo2'”: 可能的c / c ++原型是:   foo2的()   foo2(foo const&)

如果我尝试使用do f2 = f,也会发生同样的事情。据我所知,一切都存储为一个指针,所以我尝试添加一个额外的构造函数,指向foo,但无济于事。

5 个答案:

答案 0 :(得分:1)

在复制构造函数中,您将引用运算符放在错误的位置,将其放在'foo'之后。正如你的代码所代表的那样,它不能编译,至少在VS 2008上不适合我。

编辑:我明白了,感谢您的更新。好吧,我并不特别熟悉LUA,但我知道从C ++移植到C#时,有一些事情会在引用时发生变化。所以我唯一的想法是,如果你需要明确地表明你通过ref / const ref传递一个变量。 IE浏览器。在C#中通过ref传递你需要的函数调用:

int a = 10;
foo(ref a);

因此,LUA中与此类似的内容可能会导致您显示的错误。

答案 1 :(得分:1)

上帝只知道SWIG正在做什么。我的建议是咬紧牙关并使用Lua的C API,它也适用于C ++。这并不难理解,并且您将能够以您想要的方式重载foo2方法 。在Roberto Ierusalimschy的书中可以找到很好的例子 Lua中的编程;你可以得到previous edition free online

N.B。由于API是C,因此它不知道参考参数。您的Lua userdata对象应包含类foo2的C ++对象的指针

答案 2 :(得分:1)

与使用Lua的原生C API的建议一致,但由于您使用的是C ++,请试用Luabind。一旦掌握了它,它就能很好地工作。如果您确实尝试了它,请务必获得最新版本 - 它会得到积极维护并且一直在变得更好。

答案 3 :(得分:0)

如果你使用swig创建lua接口,请尝试改为:

foo2(const foo * f){* this = * f;}

swig在引用类型方面存在一些问题,但是可以毫无问题地从指针进行自动转换。

我认为const引用是swig中的问题

答案 4 :(得分:0)

您可以告诉SWIG如何使用typemap将内部指针表示转换为const引用:

%typemap(in) const Foo&
{
    if(!SWIG_IsOK(SWIG_ConvertPtr(L,$argnum, (void**)$1, $1_descriptor,1)))
    {
         SWIG_fail;
    }
}

这应该在wrap.cpp文件中生成类似于此的代码:

if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Foo,1)))
{
  SWIG_fail;
}
result = new Foo2(((Foo const &)*arg1);
SWIG_arg=0;

SWIG_Lua_NewPointerObj(L, result, SWIGTYPE_p_Foo2, 1); SWIG_arg++;