我想为A struct
重载'+'运算符,但我收到编译器警告
这是我的尝试:
struct wektor{
int x;
int y=0;
int norm(){
return x*x+y*y;
}
};
wektor& operator +(wektor &a,wektor &b){
wektor c;
c.x=a.x+b.x; // 12 line - warning here
c.y=a.y+b.y;
return c;
};
编译器警告:
[警告]非静态数据成员初始化程序仅适用于-std = c ++ 11或-std = gnu ++ 11 [默认启用] 12行
答案 0 :(得分:8)
警告告诉你这条线:
int y=0;
在C ++ 11之前,您不能在非静态非const成员上使用初始化器。如果要将y
初始化为0,则必须为wektor
提供带有成员初始化列表的构造函数。
尽管如此,您的operator+
参数应为const wektor&
类型。它也应该按值返回,因为此时您正在返回对在函数末尾将被销毁的本地对象的引用,这很糟糕。它应该是这样的:
wektor operator +(const wektor &a, const wektor &b){
wektor c;
c.x=a.x+b.x; // 12 line - warning here
c.y=a.y+b.y;
return c;
};
答案 1 :(得分:4)
首先,二元运算符+应该返回一个新值,而不是一个引用。如果以引用的形式实现为输入,则这些应该是const:
wektor operator +(const wektor &a, const wektor &b);
其次,警告是关于这个初始化:
struct wektor{
int x;
int y=0; // HERE! C++11 only
int norm(){
return x*x+y*y;
}
};
您只能在C ++ 11中执行此操作。您可以在C ++ 03中使用构造函数。
struct wektor{
wector() : y() {} // zero-initializes y
int x;
int y;
int norm(){ return x*x+y*y;}
};
回到operator+
,我会实现一个成员operator+=
,然后在非成员operator+
中使用它:
wektor operator +(wektor a, const wektor &b)
{
return a+= b;
}
或者,为wector
和x
提供y
两个参数构造函数:
wector(int x, int y) : x(x), y(y) {}
然后蚂蚁
wektor operator + (const wektor& a, const wektor &b)
{
return wector(a.x + b.x, a.y + b.y);
}
答案 2 :(得分:2)
不是那样的。签名应该是
wektor operator +(const wektor &a, const wektor &b)
即。不要通过+
运算符的引用返回,更重要的是,不要通过引用返回临时值。
答案 3 :(得分:1)
这是一个警告,你正在使用C ++ 11中的一个功能,这在以前的C ++标准中是不可用的。
当你知道你编程的内容按你的思维方式工作时,你可以 通过这样做来摆脱这个错误:
如果你正在使用CodeBlocks:
如果您正在使用命令行: 将“-std = gnu ++ 11”添加到命令arg's。