Динамический массив C ++ полиномиальный класс

Я пытаюсь построить динамический массив в 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;
}

0

Решение

Ваш класс не определяет конструктор копирования. Вам понадобится один из них, потому что конструктор копирования по умолчанию делает мелкая копия, который только копирует значение указателя, а не содержимое coefficient массив.

Проблема возникает, когда вы делаете копии своего объекта (что вы делаете повсюду), так как обе копии позже попытаются delete тот же массив, когда они разрушены.

Вы должны определить оператор присваивания также. Увидеть Правило трех.

2

Другие решения

    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){

ТАК ЭТО МОЯ ФУНКЦИОНАЛЬНАЯ РЕАЛИЗАЦИЯ …. ТАК … ДА ..

0

По вопросам рекламы [email protected]