【问题标题】:How to Overload operator+ with Polynomial Class and What Types to Return如何使用多项式类重载 operator+ 以及要返回的类型
【发布时间】:2012-10-13 20:28:25
【问题描述】:

我在重载 + 运算符时遇到问题,我不知道是什么原因。 + 运算符返回一个多项式(称为 C),但它按值返回它,其中赋值运算符期望一个多项式对象作为通过引用传递的参数。为了使 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];

    }

}

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:

    这里的问题是你混淆了全局(外部类定义)operator+operator+ 的成员类定义。

    (static) Polynomial operator+(Polynomial&amp; A, Polynomial&amp; B); 这个操作符是全局使用的,所以在一个类之外。

    在类里面你需要使用下面的签名。

    Polynomial&amp; operator+(const Polynomial&amp; 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&amp; A, Polynomial&amp; B); Polynomial Polynomial::operator+(Polynomial&amp; A, Polynomial&amp; B){/**/} 应该移到主函数上方,它现在变为:

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

    【讨论】:

    • 对不起,我不明白你的回答。当我使用 typeid(A+B).name() 时,它表示 A+B 正在返回多项式类型的变量。这很好,因为我的赋值运算符用于将一个多项式分配给另一个。如果我做 C=A,它会起作用,那为什么 C=A+B 不起作用?
    • 只需从 operator+ 定义中删除 , Polynomial&amp; B,您的代码就可以工作了。
    • 但是operator+不是成员函数,所以不需要两个Polynomial对象都传给它吗?
    • 其实是一个成员函数。为了证明这一点,您可以调用 do C=A.operator+(B); 并且它会起作用。只要它在类中定义,它就是一个成员函数。如果您需要它是全局的,请将其定义在类之外的主要上方。
    • 那么我将如何定义一个非成员函数,它是一个做加法并返回多项式对象的友元函数(以便它可以直接访问成员数据)?这里的部分重点是我试图将其设为非成员函数,因为我在某处读到,只要有可能,这样做是好的。
    【解决方案2】:

    通常你会通过以下两种方式之一重载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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多