Почему, когда я вызываю testPolynomial
, он показывает последнее значение объекта и не создает новый объект, который инициализируется равным 0?
Почему он все еще в моде и не будет создавать себя, когда он будет выполнен с помощью функции первого вызова функции (testPolynomial
)?
Полином.ч
#ifndef Header_h
#define Header_h
class Polinomial {
private:
static int degree;
static int falsse_degree;
static double coEfArr[10];
public:
//----------methods-------//
static int getMaxDegree(){return degree;}
static void printIndexDeg(int index){std::cout<<coEfArr[index];};
int getDegree(bool b){ if (b==true){return degree;}return falsse_degree;}
void findAndSetRealMaxDegree(){
int max=0;
for (int i=0; i<10; i++)
{
if (coEfArr[i]!=0)
{
max=i;
}
}
degree=max;
}
void setCoeff(int index, double coef_d)
{
coEfArr[index]=coef_d;
findAndSetRealMaxDegree();
};
static void fillWithZeros(){
for (int i=0; i<10; i++) {
coEfArr[i]=0;
}
}
;
//------ End of methods-----//
//------Begining of constructors----//
Polinomial();
Polinomial(int deg);
Polinomial(double arr[],int deg);
//-------------end of constructors-----------------//
//------copy constructors-------//
Polinomial (const Polinomial &p2);
friend std::ostream& operator<<(std::ostream& os, const Polinomial& p);
void operator = (const Polinomial &poli_obj )
{
fillWithZeros();
degree=poli_obj.degree;
falsse_degree=poli_obj.falsse_degree;
for (int i=0; i<degree; i++)
{
coEfArr[i]=poli_obj.coEfArr[i];
}
}
void * operator new(size_t size)
{
std::cout<< "Overloading new operator with size: " << size << std::endl;
void * p = malloc(size);
return p;
}
void operator delete(void * p)
{
std::cout<< "Overloading delete operator " << std::endl;
free(p);
}
};
////////////
//////////
////////////
//----------------------End of class Polinomial ------------------------//
int Polinomial::degree{0};
int Polinomial::falsse_degree{0};
double Polinomial::coEfArr[]{0};
//constructor
Polinomial::Polinomial()
{
degree=0;
};
Polinomial::Polinomial(int deg)
{
degree=0;
falsse_degree=deg;
};
Polinomial::Polinomial(double arr[],int deg)
{
falsse_degree=deg;
for (int i=0; i<=deg; i++)
{
coEfArr[i]=arr[i];
}
findAndSetRealMaxDegree();
}
//copy constructor
Polinomial::Polinomial(const Polinomial &p2){
falsse_degree=p2.falsse_degree;
for (int i=0; i<=p2.degree; i++)
{
coEfArr[i]=p2.coEfArr[i];
}
findAndSetRealMaxDegree();
}
std::ostream& operator<<(std::ostream &os, const Polinomial &p)
{
os<<"Polinomial=";
if (p.degree==0 && p.coEfArr[0]==0)
{
os<<0;
return os;
}
else
for (int i=0; i<=p.degree; i++)
{
if (i==0) {
os<<p.coEfArr[i];
}
else
os<<"+"<<p.coEfArr[i]<<"X^"<<i;
}
return os;
};
#endif /* Header_h */
Rational.h
#include "Polynom.h"
#ifndef rational_h
#define rational_h
class Rational
{
private:
static Polinomial* nom;
static Polinomial* de_nom;
public:
static void getDeNom(){std::cout<<*de_nom<<std::endl;};
static void getNom(){std::cout<<*nom<<std::endl;};
Rational();
};
Polinomial* Rational::nom=new Polinomial();
Polinomial* Rational::de_nom=new Polinomial();
Rational::Rational()
{
de_nom->setCoeff(0, 1.0);
}
#endif /* rational_h */
Main.cpp
#include <iostream>
#include "Polynom.h"
#include "rational.h"
using namespace std;
void testPolynomial();
void testRational();
int main() {
testPolynomial();
testRational();
}
void testPolynomial()
{
cout<<"----- start testPolynomial ---------"<<endl;
cout<<"test0= "<<Polinomial::getMaxDegree()<<endl;
Polinomial p1;
cout<<"test1="<<p1<<endl;
Polinomial p2(6);
p2.setCoeff(2, 0.4);
cout<<"test2= "<<p2<<"degree="<<p2.getDegree(false)<<endl;
double c[]{0.1,0.2,0,11.5,1.3};
Polinomial p3(c,4);
cout<<"test3="<<p3<<endl;
p2.setCoeff(2, 0.0);
cout<<"test4= "<<p2<<endl;
cout<<"test6 MaxDegree= "<<Polinomial::getMaxDegree()<<endl;
cout<<"___________"<<endl;
}
void testRational()
{
cout<<"-----begind rational test-----"<<endl;
cout<<"test7"<<endl;
Rational r1;
r1.getNom();
}
1 ответ
class Polinomial {
private:
static int degree;
static int falsse_degree;
static double coEfArr[10];
Это потому, что вы объявили все свои поля static
(зачем вы это сделали?). Поскольку они являются статическими, независимо от того, сколько объектов Polinomial
вы создаете, существует только одна копия каждого поля. Удалите ключевое слово static
. Это, вероятно, потребует много других изменений в вашем коде.
Polinomial::getMaxDegree
без использования объекта, а не Polinomial::getDegree
. И вы можете сделать Polinomial::getMaxDegree
статическим методом, не делая все ваши поля статическими.
getMaxDegree
предназначен для возврата максимальной степени, которую может иметь любой многочлен. В вашем случае это будет 10
, потому что это размер вашего coEfArr
.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
Polinomial
имеет конструкторы, и отсутствие конструкторов не обязательно означает, что элементы не инициализированы (вы все равно можете инициализировать элементы по умолчанию)