0

多項式クラスを作成し、クラスに従って動作するようにいくつかの演算子をオーバーロードすることに関して、宿題に問題がありました。私はほとんどのことをしましたが、デストラクタまたは機能に問題があるようです。

問題は、私のデバッグによると(私が正しくやったと思う)、コピーコンストラクターで使用すると、 + 演算子関数の戻り値が次のように2回破壊されることです。

//polynomials p1 and p2 are declared and given values beforehand
Polynomial p5=Polynomial();
p5=p1+p2;

これにより、ヒープ破損エラーが発生します。

ここに私のヘッダーコードがあります:

#ifndef POLYNOMIAL_H_
#define POLYNOMIAL_H_
#include <iostream>

using namespace std;

class Polynomial
{
public:
    Polynomial();
    Polynomial(int);
    ~Polynomial();
    Polynomial(const Polynomial &);
    int getOrder() const; 
    double getCoefficient(int) const; 
    void setOrder(int);
    void setCoefficient(int,double);
    const Polynomial &operator=(const Polynomial &);
    const bool &operator==(const Polynomial &);
    const double &operator()(double &);
    const bool &operator!=(const Polynomial &);

    friend Polynomial operator+(const Polynomial &poly1, const Polynomial &poly2);
    friend Polynomial &operator+=(Polynomial &poly1,const  Polynomial &poly2);
    friend Polynomial operator-(const Polynomial &poly1, const Polynomial &poly2);
    friend Polynomial &operator-=( Polynomial &poly1,const  Polynomial &poly2);
    friend Polynomial operator*(Polynomial poly1,double num);
private:
    int order;
    double *coefficient;
};


#endif

これが私のオーバーロードされた + 関数です。きれいではありませんが、私の問題は計算ではなく、メモリです。クラスでフレンド関数として宣言しましたが、宿題のルールにより、メンバー関数としてではなく、フリー関数として main.cpp ファイルに実装する必要があります。

   Polynomial operator+(const Polynomial &poly1, const Polynomial &poly2) //the overloaded +operator. makes the order of the result the bigger order and adds the coefficients for all the orders. returns the result. 
{
    Polynomial result;


    if(poly1.order >= poly2.order)
    {
        result.setOrder(poly1.order);
        for(int i=poly1.order;i>poly2.order;i--)
        {
            result.setCoefficient(poly1.order-i, poly1.coefficient[poly1.order-i]);
        }
        for (int i =poly2.getOrder(); i>=0;i--)
        {
            result.setCoefficient(poly1.order-i,poly1.coefficient[poly1.order-i]+poly2.coefficient[poly2.order-i]);
        }
    }
    else 
    {
        result.setOrder(poly2.order);

        for(int i=poly2.order;i>poly1.order;i--)
        {
            result.setCoefficient(poly2.order-i, poly2.coefficient[poly2.order-i]);
        }
        for (int i =poly1.order; i>=0;i--)
        {
            result.setCoefficient(poly2.order-i,poly1.coefficient[poly1.order-i]+poly2.coefficient[poly2.order-i]);
        }
    }
    return result;
}

= 演算子をオーバーロードする必要もありました。必要な場合は、その関数を次に示します。

    const Polynomial &Polynomial::operator=(const Polynomial &poly)
{
    if(this!=&poly)
    {
        if(order==poly.order)
        {
            for(int i=0;i<=order;i++)
            {
                coefficient[i]=poly.coefficient[i];
            }
        }
        else 
        {
            coefficient=new double[poly.order];
            order=poly.order;
            for(int i=0;i<=order;i++)
            {
                coefficient[i]=poly.coefficient[i];
            }
        }
    }
    return *this;
}

私はコーディングと C++ の初心者であることを心に留めておいてください。

編集: ディープ コピー コンストラクターを追加します。

 Polynomial::Polynomial(const Polynomial &copy) //deep copy constructor
{
    order=copy.order;
    coefficient=new double[copy.order];
    for (int i=0;i<=order;i++)
    {
        coefficient[i]=copy.coefficient[i];
    }
}
4

2 に答える 2

0

コピー コンストラクターとオーバーロードでは、配列operator=をコピーするときに 1 回余分に反復しています。cofficient

  coefficient=new double[copy.order];
  for (int i=0;i<=order;i++)
                ^^

スペース<を割り当てましたが、時間を繰り返しています。古い配列も呼び出す必要があります。通常、これを行う安全な方法は、最初に一時的なものに割り当てて、それを変更することです。これらの潜在的に安全でない操作がすべて成功した場合は、一時的なものを に割り当てることができます。とを使用するときに何をする必要があるかについてのしっかりした説明については、この SO の投稿を参照してください。orderorder+1delete []coefficientdeletecoefficientRule of Threecopy constructorassignment

于 2013-04-19T12:26:36.607 に答える