プロジェクトの多項式クラスを操作するために、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;
}