1

+ 演算子のオーバーロードに問題があり、原因がわかりません。+ 演算子は Polynomial (C と呼ばれます) を返しますが、代入演算子は、参照によって渡されるパラメーターとして Polynomial オブジェクトを想定しているため、値で返します。C=A+B を機能させるには、値で渡された多項式を引数として受け取る 2 つ目の代入演算子関数が必要ですか? ありがとう!

#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];

    }

}
4

2 に答える 2

0

ここでの問題は、グローバル (外部クラス定義)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){/**/}てメイン関数の上に移動する必要があり、次のようになります。

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

于 2012-10-13T20:42:17.530 に答える
0

通常、次operator+の 2 つの方法のいずれかでオーバーロードします。

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;
}
于 2012-10-13T22:30:52.117 に答える