我不知道为什么我这么难过。我想做的就是:
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,但无济于事。
答案 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++;