重载+/-运算符以添加/减去向量

时间:2015-04-28 15:06:21

标签: c++ operator-overloading

我正在为一个c ++项目开发一个类,我必须重载所有的运算符来处理向量。具体来说,我将我的矢量定义如下:

template<class Type>
ThreeVector<Type>::ThreeVector(Type x, Type y, Type z) {
    mx=x;
    my=y;
    mz=z;
}

我的+运营商:

template<class Type>
ThreeVector<Type> operator+(const ThreeVector<Type>& v, const//
ThreeVector<Type>& w) {

    return ThreeVector<Type>(v)+=w;
}

我已经重载了+ =和 - =运算符。但是,我一直收到这个错误:

ThreeVT.cxx:12:26: error: no matching function for call to// 
‘ThreeVector<double>::ThreeVector(ThreeVector<double>)’
ThreeVector<double> d=c+a;

ThreeVector.h:141:29: error: no matching function for call to 
‘ThreeVector<double>::ThreeVector(const ThreeVector<double>&)’
 return ThreeVector<Type>(v)+=w;

任何帮助将不胜感激!无论我做什么,这个错误似乎都会出现,而且我不知道在这种情况下它的真正意义。

2 个答案:

答案 0 :(得分:0)

你有几个问题:

参考的功能:

ThreeVector( ThreeVector&);
ThreeVector<Type> operator=( ThreeVector&);
ThreeVector<Type> operator+=( ThreeVector&);
ThreeVector<Type> operator-=( ThreeVector&);
ThreeVector<Type> operator-( ThreeVector&);

应该使用const引用,除非它们实际更改参数:

ThreeVector(const ThreeVector&);
ThreeVector<Type> operator=(const ThreeVector&);
ThreeVector<Type> operator+=(const ThreeVector&);
ThreeVector<Type> operator-=(const ThreeVector&);
ThreeVector<Type> operator-(const ThreeVector&);

您的访问者函数是非常量的:

Type x();
Type y();
Type z();

但应该是const:

Type x() const;
Type y() const;
Type z() const;

所有这些变化都应该在类主体和函数定义中进行。

现在,您的operator+operator+可以是自由函数或成员函数。无论哪种方式,你需要一个左手侧和一个右手侧。如果operator+是成员函数,则lhs始终为this。因此,对于二进制+函数,您的声明如下所示:

ThreeVector<Type> operator+(const ThreeVector& rhs) const;

请注意,参数由const ref传递,函数本身为const,因此可以在const ThreeVector上调用。

您的代码中的实现缺少类名。它应该看起来像:

template<class Type>
ThreeVector<Type> ThreeVector<Type>::operator+(const ThreeVector<Type>& rhs) const

然后,您的函数正文可以使用this关键字:

return ThreeVector<Type>(*this) += rhs;

关于operator + =的注释:标准约定是operator + =, - =等返回对刚更改的对象的引用。 return *this。您的功能应如下所示:

ThreeVector<Type>& operator+=(const ThreeVector&);

答案 1 :(得分:0)

+运算符中的左参数是对象本身,由&#34; this&#34;指针。它的成员与任何其他成员函数一样。所以你的+运算符应该声明为

const ThreeVector<Type> operator+(const ThreeVector<Type>& v) const;

最后一个const意味着不改变左对象 在5 + 2中,改变5或2以产生7