Почему, когда я вызываю 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();
}

c++
-3
user10903468 18 Апр 2020 в 21:31
Во-первых, ваш конструктор копирования может заменить цикл и вызвать только метод setCoeff(), который сделает за вас и то, и другое.
 – 
Omid CompSCI
18 Апр 2020 в 21:33
Никогда не используйте malloc и free для C++, используйте new и delete или смотрите на умные/уникальные указатели
 – 
Omid CompSCI
18 Апр 2020 в 21:33
Polinomial имеет конструкторы, и отсутствие конструкторов не обязательно означает, что элементы не инициализированы (вы все равно можете инициализировать элементы по умолчанию)
 – 
t.niese
18 Апр 2020 в 21:36
Это действительно МИНИМАЛЬНЫЙ пример, который вы могли бы придумать? Попробуйте урезать это, пока не останется только то, что демонстрирует вашу проблему.
 – 
Wyck
18 Апр 2020 в 21:37

1 ответ

class Polinomial {

private:
    static int degree;
    static int falsse_degree;
    static double coEfArr[10];

Это потому, что вы объявили все свои поля static (зачем вы это сделали?). Поскольку они являются статическими, независимо от того, сколько объектов Polinomial вы создаете, существует только одна копия каждого поля. Удалите ключевое слово static. Это, вероятно, потребует много других изменений в вашем коде.

6
john 18 Апр 2020 в 21:38
Он статический, потому что мой профессор прислал основной, и я должен подогнать свой код к его основному. И в основном он вызывает Polinomial::getDegree без использования и объекта, поэтому мне пришлось сделать его статическим.
 – 
user10903468
18 Апр 2020 в 22:01
Он вызывает Polinomial::getMaxDegree без использования объекта, а не Polinomial::getDegree. И вы можете сделать Polinomial::getMaxDegree статическим методом, не делая все ваши поля статическими.
 – 
john
18 Апр 2020 в 22:08
Каждый полином имеет разную степень, поэтому он не может быть статичным, но все ваши полиномы имеют одинаковый максимум. степень, так что может быть статическим.
 – 
john
18 Апр 2020 в 22:10
Спасибо большое чувак!! Я попытаюсь определить только метод как статический! Я не понял, почему все мои полиномы имеют одинаковую максимальную степень? Метод предназначен для отображения текущей максимальной степени полинома.
 – 
user10903468
18 Апр 2020 в 22:27
Я думаю, что getMaxDegree предназначен для возврата максимальной степени, которую может иметь любой многочлен. В вашем случае это будет 10, потому что это размер вашего coEfArr.
 – 
john
18 Апр 2020 в 22:34