2012-10-13 27 views
1

我无法重载+运算符,我找不出原因是什么。 +运算符返回一个Polynomial(称为C),但它通过值返回它,因为赋值运算符期望Polynomial对象作为通过引用传递的参数。为了使C = A + B工作,我是否需要第二个赋值运算符函数,该函数将通过值传递的多项式作为参数?谢谢!如何重载运算符+多项式类和什么类型返回

#include <iostream> 
#include <ctime> 
#include <cstdlib> 

using namespace std; 
void line(int lines); 

class Polynomial 
{ 
    private: 
     int degree; 
     int* coeffs; 
    public: 
     //constructors 
     Polynomial() {degree=0;coeffs=new int[1];} 
     Polynomial(int deg) {degree=deg;coeffs=new int[deg+1];} 
     Polynomial(const Polynomial& A); 

     //mutators 
     void GetCoeffs(istream& in); 
     void EditCoeff(int deg); 
     void ResetCoeffs(); 
     int Coeff(int deg); 
     void Randomize(int max); 

     //accessors 
     void Show(ostream& out); 
     int Degree() {return degree;} 

     //operators 
     friend Polynomial operator+(Polynomial& A, Polynomial& B); 
     void operator =(Polynomial A); 
}; 


int main() 
{ 
    Polynomial A(5); 
    Polynomial B(5); 
    A.Randomize(5); 
    B.Randomize(5); 

    A.Show(cout); 
    line(2); 
    B.Show(cout); 
    line(2); 
    Polynomial C(5); 
    C=A+B; 
    C.Show(cout); 

    return 0; 
} 

void Polynomial::Randomize(int max) 
{ 
    for (int i=degree; i>=0; i--) 
    { 
     coeffs[i]=rand()%(max+1) + 1; 
     if ((rand()%(101) + 1)%2 == 0) 
      coeffs[i]*=-1; 
    } 
} 

void Polynomial::operator =(Polynomial A) 
{ 
    if (degree==A.degree) 
    { 
     for (int i=degree; i>=0; i--) 
     { 
      coeffs[i]=A.coeffs[i]; 
     } 
    } 
} 

Polynomial Polynomial::operator+(Polynomial& A, Polynomial& B) 
{ 
    Polynomial C; 
    if (A.degree>=B.degree) 
    { 
     C=A; 
     for (int i=B.degree; i>=0; i--) 
     { 
      C.coeffs[i]=A.coeffs[i]+B.coeffs[i]; 
     } 
     C.Show(cout); 
     return C; 
    } 
    else 
    { 
     C=B; 
     for (int i=A.degree; i>=0; i--) 
     { 
      C.coeffs[i]=A.coeffs[i]+B.coeffs[i]; 
     } 
     C.Show(cout); 
     return C; 

    } 

} 

int Polynomial::Coeff(int deg) 
{ 
    return coeffs[deg]; 
} 

void line(int lines) 
{ 
    for (int i=0; i<lines; i++) 
     cout << endl; 
} 

void Polynomial::GetCoeffs(istream& in) 
{ 
    for (int i=degree; i>=0; i--) 
    { 
     in >> coeffs[i]; 
    } 
    in.ignore(); 
} 

void Polynomial::Show(ostream& out) 
{ 
    for (int i=degree; i>=0; i--) 
    { 
     if (coeffs[i]>=0) 
     { 
      if (i!=degree) 
       out << " + "; 
      out << coeffs[i]; 


     } 
     else 
     { 
      if (coeffs[i]<0) 
       out << " - "; 
       out << 0-coeffs[i]; 
     } 
     if (i>1) 
      out << "x^" << i; 
     else if (i==1) 
      out << "x"; 

    } 
} 

Polynomial::Polynomial(const Polynomial& A) 
{ 
    coeffs=new int[A.degree+1]; 
    degree=A.degree; 
    for (int i=A.degree; i>=0; i--) 
    { 
     coeffs[i]=A.coeffs[i]; 

    } 

} 

回答

0

这里这个问题你已经混了全球(外类定义)operator+operator+成员类定义。

staticPolynomial operator+(Polynomial& A, Polynomial& B);此运算符在全局范围内使用,因此不在类中。

在课堂内部,您需要使用以下签名。

Polynomial& operator+(const Polynomial& other);

下面是一个例子。

Polynomial p; 
Polynomial q; 
p = p + q; 

这种情况的代码,如果操作者是在类定义是:

p = p.operator+(q); //only needs one parameter. 

这种情况的代码,如果操作者全局定义是:

p = ::operator+(p, q); //needs both parameter 

注意: 若要将其用作非会员功能删除Polynomial operator+(Polynomial& A, Polynomial& B);从你的定义Polynomial Polynomial::operator+(Polynomial& A, Polynomial& B){/**/}应该是主要的功能上述举动,现在变成了:

static Polynomial operator+(Polynomial& A, Polynomial& B){/**/}

+0

对不起,但我不明白你的答案。当我使用typeid(A + B).name()时,它表示A + B正在返回Polynomial类型的变量。这很好,因为我的赋值操作符用于将一个多项式分配给另一个多项式。如果我做C = A,那么它可以工作,那么为什么C = A + B不工作? – BrownBeard93423

+0

只需从运算符+定义中删除',Polynomial&B',您的代码就可以工作。 – andre

+0

但是operator +不是一个成员函数,所以它不需要将Polynomial对象都传递给它? – BrownBeard93423

0

通常你会在以下两种方式之一重载operator+

Polynomial operator+(const Polynomial &other) const; 

或作为非成员功能,

Polynomial operator+(Polynomial a, const Polynomial &b); 

您通常不需要friend预选赛实施以来,后者将有可能在类中已定义的另一个重载运营商方面:

Polynomial operator+=(const Polynomial &other); 

那么你的非成员的实现将只是:

Polynomial operator+(Polynomial a, const Polynomial &b) 
{ 
    a+=b; 
    return a; 
} 

如果硬要在使用功能为你的代码中定义的,那么你将需要使之成为 friend如果你需要访问私有成员:

Polynomial operator+(Polynomial &a, Polynomial &b) 
{ 
    Polynomial p; 
    // add them as needed 
    return p; 
}