Klasa doublevector

0

Witam, mam problem z implementacją w mojej klasie reprezentującej wektory, funkcji push.Back( ), dodającej na końcu wektora kopię przekazanego argument. Funkcja dodaje na koncu tablicy element ale nie taki jak oczekuje (tzn. 3.4564e+674 itp...) Oto kod:

#include<iostream>

using namespace std;

class doublevector
{
      public:
             doublevector( );
             
             doublevector( int liczba_elementow );
             
             doublevector(const doublevector& obiekt);
             
             ~doublevector( );
             
             void push_Back(double element);
             
             bool operator ==(doublevector& obiekt);
             
             void operator =(const doublevector& obiekt);         
             
             friend istream& operator >>(istream& dane_wej, 
             const doublevector& obiekt);
             
             friend ostream& operator <<(ostream& dane_wyj, 
             const doublevector& obiekt);
             
      private:
              int liczba_elementow;
              double *wartosc;
              
};

int main( )
{
    doublevector wektor(5), wektor2(1);
    double element;
    cout << "Podaj dowolny ciag znakow: \n";
    cin >> wektor;
    cout << "Podaj element, ktory chcesz dodac: \n";
    cin >> element;
    wektor.push_Back(element);
    cout << "Oto twoje dane : " << endl << wektor << endl;
    system("pause");
    return 0;
}

doublevector::doublevector( ) : liczba_elementow(50)
{
    wartosc = new double[liczba_elementow + 1];
    wartosc[0] = '\0';
    cout << "Witam, z kontruktora domyslnego : ) \n";
}

doublevector::doublevector(const doublevector& obiekt) :liczba_elementow(obiekt.liczba_elementow)
    {
        wartosc = new double[liczba_elementow + 1]; //+1 jest na '\0'.
     for (int j = 0; j < obiekt.liczba_elementow; j++)
     {
         wartosc[j] = obiekt.wartosc[j];
     }
     wartosc[liczba_elementow] = '\0';
    }

doublevector::doublevector(int rozmiar) : liczba_elementow(rozmiar)
    {
        wartosc = new double[liczba_elementow + 1]; 
        wartosc[0] = '\0';
    }
    
doublevector::~doublevector( )
    {
        delete [] wartosc;
    }
    
istream& operator >>(istream& dane_wej, const doublevector& obiekt)
    {
         for (int i = 0; i < obiekt.liczba_elementow; i++)
        dane_wej >> obiekt.wartosc[i];
        return dane_wej;
    }

ostream& operator <<(ostream& dane_wyj, const doublevector& obiekt)
    {
        for (int i = 0; i < obiekt.liczba_elementow; i++) 
        dane_wyj << obiekt.wartosc[i] << " ";
        return dane_wyj;
    }
bool doublevector::operator ==(doublevector& obiekt)
{  
       int licznik = 0;
        for (int j = 0; j < obiekt.liczba_elementow; j++)
        {
             if (wartosc[j] == obiekt.wartosc[j])
             
             licznik++;
        }
        return (licznik >= obiekt.liczba_elementow);
}    

void doublevector::operator =(const doublevector& obiekt)
{
     int nowa_dlugosc = obiekt.liczba_elementow;
     if (nowa_dlugosc > liczba_elementow)
     {
                      delete [] wartosc;
                      liczba_elementow = nowa_dlugosc;
                      wartosc = new double[liczba_elementow + 1];
     }
     for (int j = 0; j < obiekt.liczba_elementow; j++)
     {
         wartosc[j] = obiekt.wartosc[j];
         wartosc[nowa_dlugosc] = '\0';
     }
}

void doublevector::push_Back(double element)
 {
      liczba_elementow = liczba_elementow + 1;
      wartosc[liczba_elementow] = element;
      
 }

    
0

Bo dajesz zmienną znak(?), nie element,

0

Nie, przy wklejaniu zmienialem nazewnictwo, żeby bylo zrozumiale i zapomnialem w tym jednym miejscu.

0

push_back dodaje elementy na index'ie liczba_elementow, który wynosi 50! To, że zwiększysz zmienną liczba_elementów nie sprawia, że tablica jest większa! Musisz ponownie zadeklarować tablice wartosc.

0

Masz pomysł jak to zrealizować, bo jak utworzyć nową tablicę dynamiczną wiem...

delete [] wartosc;
wartosc = new double[liczba_elementow + 1]

Tylko, jak dopisać w niej ten nieszczęsny element...

0

Po prostu robisz drugą dynamiczną tablicę, kopiujesz z jednej do drugiej, zmienasz rozmiar pierwszej, kopiujesz z drugiej do pierwszej i dodajesz na końcu element, i zwiększasz licznik rozmiaru o 1.

0

Tak też zrobiłem:

  double *pom;
      int nowa_dlugosc = obiekt.liczba_elementow + 1;
      pom = new double[liczba_elementow+1];
      for (int j = 0; j < obiekt.liczba_elementow; j++)
     {
         pom[j] = obiekt.wartosc[j];
         pom[nowa_dlugosc] = '\0';
     }
     liczba_elementow++;
      for (int k = 0; k < liczba_elementow; k++)
     {
         obiekt.wartosc[k] = pom[k];
     }
     obiekt.wartosc[nowa_dlugosc] = znak; 

Ale wyjście wciąż wygląda tak samo... Już nie mam pomysłów.

0

Mógłby ktoś spojrzeć na te wypociny?

0

double *pom;
int nowa_dlugosc = obiekt.liczba_elementow + 1;
pom = new double[liczba_elementow+1];
for (int j = 0; j < obiekt.liczba_elementow; j++)
{
pom[j] = obiekt.wartosc[j];
pom[nowa_dlugosc] = '\0'; //Tomek - tu jest błąd - wychodzisz poza rozmiar tablicy. Poza tym po co ci na ostatnim miejscu wpisywać '\0'? Przecież to nie jest tablica charów?
}
liczba_elementow++;
for (int k = 0; k < liczba_elementow; k++)
{
obiekt.wartosc[k] = pom[k];
}
obiekt.wartosc[nowa_dlugosc] = znak;

0

I jeszcze z innej beczki, z góry sorki za głupie pytanie: piszesz tą klasę dla samokształcenia, czy z jakichś względów nie możesz użyć std::vector<double>?

1 użytkowników online, w tym zalogowanych: 0, gości: 1