多項式クラスを作成し、クラスに従って動作するようにいくつかの演算子をオーバーロードすることに関して、宿題に問題がありました。私はほとんどのことをしましたが、デストラクタまたは機能に問題があるようです。
問題は、私のデバッグによると(私が正しくやったと思う)、コピーコンストラクターで使用すると、 + 演算子関数の戻り値が次のように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 ©) //deep copy constructor
{
order=copy.order;
coefficient=new double[copy.order];
for (int i=0;i<=order;i++)
{
coefficient[i]=copy.coefficient[i];
}
}