提问者:小点点

在myVector类中重载运算符+


我知道这个问题在这里和互联网上出现过很多次,但是即使在这个网站上搜索,我也不能在myVector类中重载+运算符。 奇怪的是,我可以重载“=”运算符,但当我编写运算符“+”的声明和定义时,我得到了一个错误。

更具体地说,我将操作符声明为

myvec(&S; myvec::operator+(const myvec&v,const myvec&w)

定义是

myvec& myvec::operator+(const myvec& v, const myvec& w){
     int d = v.size();
        myvec x(d);
        for(int i=0;i<d;i++){
            x(i)=v(i)+w(i);
        }
       return x;
    }

在下面我的小课堂上:

#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

class myvec{
private:
int dimension;
double *data;

public:
myvec(int dim);
myvec(const myvec &v);
 ~myvec();
 

int size() const;
void Print();
double& operator()(int i);
myvec& operator=(const myvec& v);
myvec& operator+(const myvec& v, const myvec& w);

};


myvec::myvec(int dim){
    dimension = dim;
    data = new double[dim];
    
    for(int i=0;i<dimension;i++){
        data[i] = 0.0;
    }
}



myvec::myvec(const myvec& v){
    int dimensione = v.size();
    data = new double[dimensione];
    for(int i=0;i<dimensione;i++){
        data[i] = v.data[i];
    }
}



myvec::~myvec(){
    dimension = 0;
    delete[] data;
    data = NULL;
}


int myvec::size() const{
    return dimension;
}



double& myvec::operator()(int i){
    return data[i];                
}

myvec& myvec::operator=(const myvec& v){
    
    int dim  = v.size();
    for (int i = 0; i < dim; ++i){
        data[i] = v.data[i]; 
    }
    return *this;
 }

myvec& myvec::operator+(const myvec& v, const myvec& w){
 int d = v.size();
    myvec x(d);
    for(int i=0;i<d;i++){
        x(i)=v(i)+w(i);
    }
   return x;
}
  


void myvec::Print(){
    for(int i=0;i<dimension;i++){
        cout << data[i]<<endl;
    }
}

编译器给出错误“testmyvec.cp.cc:77:59:error:'myvec&myvec::operator+(const myvec&;,const myvec&;)‘必须采用零个或一个参数”

它清楚地引用了+运算符的定义。 如何修复它以使操作员超载?


共2个答案

匿名用户

将重载运算符移出MyVec类。 也不要返回对局部变量的引用,将返回类型更改为myvec

class myvec{
    ...
};

myvec operator+(const myvec& v, const myvec& w);

myvec operator+(const myvec& v, const myvec& w) {
    int d = v.size();
    myvec x(d);
    for(int i=0;i<d;i++) {
        x(i)=v(i)+w(i);
    }
    return x;
}

operator+接受两个参数,如果您在类中声明它,并给它两个常规参数,那么您就得到了一个接受三个参数的operator+,这是不允许的。

要获得全面的建议,请看这里

匿名用户

编译员已经给了你答案:“必须取零或一个参数”。

声明应该是myvec运算符+(常量myvec&;);,并且在定义中使用如下:

myvec myvec::operator +(const myvec& w)
{
    int d = v.size();
    myvec x(d);
    for (int i = 0; i < d; i++) {
        x(i) = (*this)(i) + w(i);
    }
    return x;
}

并且不返回对本地对象的引用。