3

我不知道为什么我很难处理这个。我想做的就是:

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;
*/

我遇到的问题是,在 swigging 这段代码之后,我无法弄清楚如何使 lua 脚本运行良好。

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

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

如果我尝试使用 do f2 = f,也会发生同样的事情。据我了解,所有内容都存储为指针,因此我确实尝试添加一个额外的构造函数,该构造函数将指针指向 foo 但无济于事。

4

5 回答 5

1

只有上帝知道 SWIG 在做什么。我的建议是咬紧牙关,使用 Lua 的C API,它也适用于 C++。这并不难学,而且您可以完全按照您想要的方式重载该foo2方法。很好的例子可以在 Roberto Ierusalimschy 的书Programming in Lua中找到;您可以在线免费获得上一版

NB 由于 API 是 C,它不知道从参考参数。你的 Lua userdata 对象应该包含一个指向class 的 C++ 对象的指针foo2

于 2009-08-07T23:01:29.047 回答
1

在复制构造函数中,您将引用运算符放在错误的位置,将其放在“foo”之后。就您的代码而言,它无法编译,至少在 VS 2008 上对我而言不是。

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

int a = 10;
foo(ref a);

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

于 2009-08-07T17:37:35.020 回答
1

按照使用 Lua 的本机 C API 的建议,但由于您使用的是 C++,请尝试Luabind。一旦你掌握了它,它就会很好地工作。如果您确实尝试过,请确保获得最新版本——它一直在积极维护并变得更好。

于 2009-08-08T03:18:14.880 回答
0

如果你用 swig 制作 lua 接口,试试这个:

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

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

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

于 2009-10-08T08:05:09.273 回答
0

您可以告诉 SWIG 如何使用类型映射将内部指针表示形式转换为 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++;
于 2009-11-06T14:46:59.510 回答