c++ - 如何使用多项式类重载 operator+ 以及返回什么类型

标签 c++ operator-overloading

我在重载 + 运算符时遇到问题,我无法弄清楚原因是什么。 + 运算符返回一个 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];

    }

}

最佳答案

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

(static) Polynomial 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){/**/} 应该移动到 main 函数之上,它现在变成:

静态多项式运算符+(Polynomial& A, Polynomial& B){/**/>

关于c++ - 如何使用多项式类重载 operator+ 以及返回什么类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12876694/

相关文章:

c++ - 如何将对象添加到 std::vector<unique_ptr<obj>>?

java - 以下程序的时间复杂度

c++ - 无法理解静态行为

c++ - Range-v3运算符重载以编写较短的代码

operator-overloading - Coq 符号中的重载运算符

c++ - 运算符 << 在构造函数中重载

c++ - 如何将字符串转换为由 C++ 中的字符组成的字符串数组?

c++ - C 函数从 iOS 设备设置中查找 iOS 用户 12/24 小时偏好

c++ - 使用 struct 作为 map 的 KEY 和 VALUE。 find() 操作给出错误

c++ - 为什么[]的重载函数在这里不起作用?