用Swig将C++的类传递给Lua时,可以通过引用传递类。

我不知道为什么我在这件事上遇到了麻烦。我想做的只是这样的:

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;
};

/* 使用方法(cpp):

   foo f;
   foo2 f2(f);

   // 或使用 = 操作符
   f2 = f;
*/

我的问题是,在完成代码生成后,我无法弄清楚如何使lua脚本与之配合。

/* 使用方法(lua)
   f = example.foo()
   f2 = example.foo2(f) --出错
*/

我收到的错误是"Wrong arguments for overloaded function 'new_Foo2'": 可能的c/c++原型是: foo2() foo2(foo const &)

如果我尝试使用do f2 = f也会发生同样的事情。我理解这一切都以指针的方式存储,所以我尝试添加一个额外的构造函数,它以指向foo的指针作为参数,但没有成功。

原文链接 https://stackoverflow.com/questions/1246038

点赞
stackoverflow用户132961
stackoverflow用户132961

编辑:我知道了,感谢更新。虽然我不是很熟悉 Lua,但我知道从 C++ 移植到 C# 时,在引用方面会有一些变化。因此,我的唯一想法就是如果需要显式指示传递给变量的是引用/常量引用。也就是说,在 C# 中,要在函数调用中传递引用,你需要:

int a = 10;
foo(ref a);

因此,在 Lua 中类似于此的东西可能会导致你展示的错误。

2009-08-07 17:37:35
stackoverflow用户41661
stackoverflow用户41661

神只知道 SWIG 在做什么。我建议勇敢尝试使用 Lua 的 C API,它也可以与 C++ 一起使用。学习起来并不难,你可以完全按照自己的方式重载 foo2 方法。在 Roberto Ierusalimschy 的书《Lua 编程》中有很好的例子;你可以在 以前的版本 免费在线获取。

注意:由于 API 是用 C 编写的,它并不知道引用参数。你的 Lua userdata 对象应该包含一个指向 foo2 类的 C++ 对象的指针。

2009-08-07 23:01:29
stackoverflow用户4323
stackoverflow用户4323

类似于使用Lua的本地C API的建议,但由于你在C ++中,可以尝试使用[Luabind](http://www.rasterbar.com/products/luabind.html)。一旦你掌握了它的使用方法,它就非常好用。如果你尝试了它,请确保获取最新的版本 - 它正在积极维护,而且一直在不断改进。

2009-08-08 03:18:14
stackoverflow用户88888888
stackoverflow用户88888888

如果你使用 swig 来创建 lua 接口,可以试试这个方法:

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

Swig 在处理引用类型时可能会出现一些问题,但是在指针的自动转换方面没有问题。

我认为这里 swig 遇到的问题是 const 引用。

2009-10-08 08:05:09
stackoverflow用户48940
stackoverflow用户48940

你可以通过使用 typemap 来告诉 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-06 14:46:59