0

我的作业一直有问题,关于制作多项式类和重载一些运算符以根据类工作。我已经完成了大部分工作,但我的析构函数或函数似乎有问题。

问题是,根据我的调试(如果我做对了,我认为我做到了),当与我的复制构造函数一起使用时,我的 + 运算符函数 get 的返回值被破坏了两次,如下所示:

//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

1

您为双打分配内存poly.order,但在您的 for 循环中,最后一个索引将是poly.order它应该poly.order-1将 <= 更改为 < 将解决该问题。

   coefficient=new double[poly.order];//This is memory leak previous coefficient needs to be deleted
    order=poly.order;
    for(int i=0;i<=order;i++)//<= will lead to overflow and heap corruption
    {
        coefficient[i]=poly.coefficient[i];
    }
于 2013-04-19T12:23:11.497 回答
0

在您的复制构造函数和重载中,您在复制数组operator=时会额外迭代一次:cofficient

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

那应该是<,您已经分配了order空间,但是您正在迭代order+1时间。您还需要调用delete []coefficient数组。通常,执行此操作的安全方法是首先分配给临时对象并对其进行修改,如果所有这些潜在的不安全操作都成功,那么您可以delete将临时对象分配给coefficient. 您可以在上查看此 SO 帖子,以获得有关使用andRule of Three时需要做什么的可靠解释。copy constructorassignment

于 2013-04-19T12:26:36.607 回答