动态数组C++多项式类

Dynamic Array C++ Polynomial Class

本文关键字:多项式 C++ 数组 动态      更新时间:2023-10-16

我正在尝试用C++构建一个动态数组,以便为项目使用多项式类。我对C++还很陌生,我很迷茫。我相信我已经正确分配了内存,但我的析构函数遇到了问题,说"释放的内存没有分配。"如果我把它注释掉,它会起作用,但之后我就迷路了。有什么想法吗?

#ifndef __Chapter9Program__Polynomial__
#define __Chapter9Program__Polynomial__
#include <iostream>
using namespace std;
class Polynomial
{
    public:
    Polynomial(int deg, int coeff[]);
    Polynomial operator+(Polynomial other);
    Polynomial operator-(Polynomial other);
    Polynomial operator*(Polynomial other);
    ostream& operator<<(ostream& os);//, const Polynomial& object);
    const int getDegree();
    const int getCoeff(const int index);
    double evaluateAt(double x); //Finds P(x)
    void show();
    string print();
    // destructor
    ~Polynomial();
private:
    int degree;
    int *coefficient; //Alllocate memory
};
#endif /* defined(__Chapter9Program__Polynomial__) */

#include "Polynomial.h"
using namespace std;
#include <iostream>
//Constructor
Polynomial::Polynomial(int deg, int coeff[])
{
degree = deg;
coefficient = new int [degree];
for( int i = 0; i <= degree; i++)
{
    coefficient[i] = coeff[i];
}
}
//Destructor
Polynomial::~Polynomial()
{
if( coefficient )
{
    delete [] coefficient;
    coefficient = NULL;
}
}
//finds P(x)
double Polynomial::evaluateAt(double x)
{
double sum = 0.0;
double xPow = 1.0;
if( coefficient )
    for(int i=0; i<degree; i++)
    {
        sum += xPow*coefficient[i];
        xPow *= x;
    }
return sum;
}
Polynomial Polynomial::operator+(Polynomial other)
{
int first[degree];
int second[degree];
for(int i = 0; i< degree; i++)
{
    first[i] = 0;
    second[i] = 0;
}
int newDeg;
int temp[degree];
int final[degree];
int final2[degree];
if(degree > other.getDegree())
{
    newDeg = degree;
}
else
{
    newDeg = other.getDegree();
}
if(degree > other.getDegree())
{
    for(int i=0;i<=degree;i++)
    {
        first[i] = coefficient[degree-i];
    }
    for(int i = 0; i <= other.getDegree(); i++)
    {
        second[i] = other.getCoeff(other.getDegree()-i);
    }
    for(int i = 0; i<degree; i++)
    {
        temp[i] = first[i]+second[i];
    }
    for(int i=degree-1; i>=0; i--)
    {
        final[i] = temp[i-i];
    }
    for(int i=0;i<=newDeg;i++)
    {
        final2[i] = final[(degree-1)-(newDeg-i)];
    }
}
else if(degree == other.getDegree())
{
    for(int i=0;i<=degree;i++)
    {
        first[i] = coefficient[i];
    }
    for( int i = 0; i <= other.getDegree(); i++)
    {
        second[i] = other.getCoeff(i);
    }
    for(int i = 0; i<degree; i++)
    {
        final[i] = first[i]+second[i];
    }
    for(int i=0;i<=newDeg;i++)
    {
        final2[i] = final[(degree - 1)-(newDeg-i)];
    }
}
else
{
    for( int i = 0; i <= other.getDegree(); i++)
    {
        second[i] = other.getCoeff(other.getDegree()-i);
    }
    for(int i = 0; i <= degree; i++)
    {
        first[i] = coefficient[degree-i];
    }
    for(int i = 0; i<degree; i++)
    {
        temp[i] = first[i]+second[i];
    }
    for(int i=degree-1; i>=0; i--)
    {
        final[i] = temp[i-1];
    }
    for(int i=0;i<=newDeg;i++)
    {
        final2[i] = final[(degree - 1)-(newDeg-i)];
    }
}
return Polynomial(newDeg,final2);
}
Polynomial Polynomial::operator-(Polynomial other)
{
int first[degree];
int second[degree];
for(int i = 0; i< degree; i++)
{
    first[i] = 0;
    second[i] = 0;
}
int newDeg;
int temp[degree];
int final[degree];
int final2[degree];
if(degree > other.getDegree())
{
    newDeg = degree;
}
else
{
    newDeg = other.getDegree();
}
if(degree > other.getDegree())
{
    for(int i=0;i<=degree;i++)
    {
        first[i] = coefficient[degree-i];
    }
    for(int i = 0; i <= other.getDegree(); i++)
    {
        second[i] = other.getCoeff(other.getDegree()-i);
    }
    for(int i = 0; i<degree; i++)
    {
        temp[i] = first[i]-second[i];
    }
    for(int i=0; i<degree; i++)
    {
        final[i] = temp[(degree-1)-i];
    }
    for(int i=0;i<=newDeg;i++)
    {
        final2[i] = final[(degree - 1)-(newDeg-i)];
    }
}
else if(degree == other.getDegree())
{
    for(int i=0;i<=degree;i++)
    {
        first[i] = coefficient[i];
    }
    for( int i = 0; i <= other.getDegree(); i++)
    {
        second[i] = other.getCoeff(i);
    }
    for(int i = 0; i<degree; i++)
    {
        final[i] = first[i]-second[i];
    }
    for(int i=0;i<=newDeg;i++)
    {
        final2[i] = final[(degree - 1)-(newDeg-i)];
    }
}
else
{
    for( int i = 0; i <= other.getDegree(); i++)
    {
        second[i] = other.getCoeff(other.getDegree()-i);
    }
    for(int i = 0; i <= degree; i++)
    {
        first[i] = coefficient[degree-i];
    }
    for(int i = 0; i<degree; i++)
    {
        temp[i] = first[i]-second[i];
    }
    for(int i=0; i<degree; i++)
    {
        final[i] = temp[(degree - 1)-i];
    }
    for(int i=0;i<=newDeg;i++)
    {
        final2[i] = final[(degree - 1)-(newDeg-i)];
        //cout<<final2[i]<<endl;
    }
}
return Polynomial(newDeg,final2);
}
Polynomial Polynomial::operator*(Polynomial other)
{
int newDeg = degree + other.getDegree();
int resultCoeff[degree];
for(int i = 0; i<degree; i++)
{
    resultCoeff[i] = 0;
}
//cout<<resultCoeff[5]<<endl;
for(int i = 0; i<=degree; i++)
{
    for(int j = 0; j<=other.getDegree(); j++)
    {
        resultCoeff[i+j] += (other.getCoeff(j)*coefficient[i]);
        //cout<<i+j<<endl;
        //cout<<other.getCoeff(j)<<endl;
        //cout<<coefficient[i]<<endl;
        //cout<<resultCoeff[i+j]<<endl;
    }
}
return Polynomial(newDeg,resultCoeff);
}

string Polynomial::print()
{
string result;
int deg = degree;
for(int i = 0; i<=degree; i++)
{
    if(result == "")
    {
        //cout<<coefficient[i]<<endl;
        result = to_string(coefficient[i]);
        result += "x^";
        result += to_string(deg);
        deg -= 1;
    }
    else //if(coefficient[i] >= 0)
    {
        //cout<<coefficient[i]<<endl;
        result += "+";
        result += to_string(coefficient[i]);
        result += "x^";
        result += to_string(deg);
        deg -= 1;
    }
    //else if(coefficient[i] < 0)
    //{
        //cout<<coefficient[i]<<endl;
    //    result += "-";
    //    result += to_string(coefficient[i]);
    //    result += "x^";
    //    result += to_string(deg);
    //    deg -= 1;
    //}
}
return result;
}
const int Polynomial::getDegree()
{
return degree;
}
const int Polynomial::getCoeff(int index)
{
return coefficient[index];
}

主要

#include <iostream>
#include "Polynomial.h"
int main()
{
using namespace std;
int degree = 2;
int coefficients[10] = {2,3,5};
int degree2 = 3;
int coefficients2[10] = {1,5,2,3};
Polynomial test = Polynomial(degree, coefficients);
cout << &test<<endl;//.print()<<endl;
Polynomial test2 = Polynomial(degree2, coefficients2);
cout << &test2<<endl;//.print()<<endl;
Polynomial test3 = test + test2;
cout << &test3<<endl;//.print()<<endl;
Polynomial test4 = test - test2;
cout << &test4<<endl;//.print()<<endl;
Polynomial test5 = test * test2;
cout << &test5<<endl;//.print();
return 0;
}

您的类没有定义复制构造函数。您将需要其中一个,因为默认的复制构造函数执行浅复制,它只复制指针值,而不复制coefficient数组的内容。

当您对对象进行复制(您可以在各处进行复制)时,问题就会出现,因为两个副本稍后都会在销毁时尝试delete相同的数组。

您还需要定义赋值运算符。请参阅"三条规则"。

    ostream& operator <<(ostream &outs,const Polynomial &poly){
    int i;
    outs << "{";
    for (i= poly.size-1; i >= 0; i--)
        if ((poly.p[i] != 0) && (i==0))
            outs << poly.p[i];
        else if (poly.p[i] > 0)
            outs << poly.p[i] << "x"<< i << " + ";
        else if (poly.p[i] < 0)
            outs << "" << poly.p[i] << "x"<< i << " + " ;
    outs << "}";
    return outs;
}

    Polynomial::Polynomial() {
    int i;
    //cout << "nconstructor called";
    this->size = 10;
    p = new int[this->size];
    for (i=0; i < this->size; i++)
        p[i] = 0;   
}
    Polynomial::Polynomial(const Polynomial &set) {
    int i;
    this->p = new int[this->size];
    //cout << "ncopy constructor called";
    for (i=0; i < this->size; i++)
        p[i] = set.p[i];    
}
    Polynomial::~Polynomial() {
    //cout << "ndestructor called";    
    delete [] p;
}
    Polynomial Polynomial::operator =(const Polynomial &set){
    for (int i=0; i < this->size; i++)
        this->p[i] = set.p[i];  
    return *this;
}
    void Polynomial::display()const{
    for(int i = (this->size)-1; i>=0; i--){
        cout << this->p[i] << "x"<< i << " + ";
    }
}
    void Polynomial::addTerm(int x, int expo) {
    if (expo >= 0 && expo < this->size)
        p[expo] += x;
    / *//   else
    //  if(expo >= this->size)
    //  {
            Polynomial temp;
            temp.size *= 2;
        //  temp = new int[this->size*2];
            for(int i=0; i<temp.size; i++){
                temp.p[i] = this->p[i];
            }
            temp.p[expo] = x;
            this->size*2;
            for(int j=0; j<this->size; j++){
                this->p[j] = temp.p[j];
            }
        }*/
}
    bool Polynomial::operator ==(const Polynomial &poly) const {
    bool ok = true;
    for (int i=0 ; i < this->size; i++) {
        if (this->p[i] != poly.p[i]) {
            ok = false;
            break;
        }
    }
    return ok;
}
    Polynomial Polynomial::operator +(const Polynomial &poly) const {
    Polynomial result;
    int i;
    for (i=0; i < this->size; i++) 
        result.p[i] = this->p[i] + poly.p[i];       
    result.size = this->size;
    return result;
}
    Polynomial Polynomial::operator +=(const Polynomial &poly){
    int i;
    for (i=0; i < this->size; i++) 
        this->p[i] = this->p[i] + poly.p[i];            
    return *this;
}
    Polynomial Polynomial::operator -(const Polynomial &poly) const {
     Polynomial result;
     int i;
     for (i=0; i < this->size; i++) 
        result.p[i] = this->p[i] - poly.p[i];       
     return result;
   }
    Polynomial Polynomial::operator -=(const Polynomial &poly){
    Polynomial result;
    int i;
    for (i=0; i < this->size; i++) 
        this->p[i] = this->p[i] - poly.p[i];            
    return *this;
   }

    //bool Polynomial::operator !=(const Polynomial &poly) const {
    //  return !( *this == poly);}
    Polynomial Polynomial::Derivative( ) const{
    Polynomial result;
    for (int i=1; i < this->size; i++)
        if(p[i] != 0)
            result.p[i-1] = p[i] * i;       
    return result;
   }
    int Polynomial::Evaluate(int x) const{
    int result = 0;
    for(int i=0; i < this->size ; i++){     
        result = result + (p[i] * pow(x,i));        
    }
    return result;
    }
    /*
    Polynomial Polynomial::operator *(const Polynomial &p) const{
    }
Polynomial Polynomial::operator *=(const Polynomial &p){

这就是我的功能实现。。。。所以。。。是的。。