Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ , klasy , wskaźniki

Ostatnio zmodyfikowano 2018-07-23 23:38
Autor Wiadomość
Kefirek
Temat założony przez niniejszego użytkownika
C++ , klasy , wskaźniki
» 2018-07-23 22:46:32
Witam
Funkcja wczytuje dane z pliku binarnego do obiektu klasy Magazyn. Następnie obiekt tej klasy pakowany jest do wektora na obiekty klasy Magazyn. Klasa Magazyn posiada wskaźnik do klasy Towar. Klasa Towar posiada wskaźnik do klasy Gabaryt. Poniżej wspomniana funkcja:
Zmienna cMagazyn jest wektorm: QVector<Magazyn> cMagazyn
C/C++
QVector < Magazyn > & MagazynDao::ReadMagazynFromFile()
{
    if( cMagazyn.size() > 0 )
         cMagazyn.clear();
   
    Gabaryt * gabaryt = new Gabaryt();
    Towar * towar = new Towar( gabaryt );
    Magazyn * magazyn = new Magazyn( towar );
   
    magazyn->SetNazwa( "Dom" ); //było magazyn->SetNazwa(cModelName)
   
    QFile file( "./Magazins/" + QString( magazyn->GetNazwa() + ".mag" ) );
    if( file.exists() )
    {
        file.open( QIODevice::ReadOnly );
       
        QDataStream in( & file );
        in.setVersion( QDataStream::Qt_5_10 );
        int i = 0;
        while( !in.atEnd() )
        {
            in >> * magazyn;
            cMagazyn.push_back( * magazyn );
           
            qDebug() << cMagazyn[ i ].GetTowar().GetProducer() << " - " << i; //pkt 1
            i++;
        }
       
        file.close();
       
        for( int i = 0; i < cMagazyn.size(); i++ )
             qDebug() << cMagazyn[ i ].GetTowar().GetProducer(); //pkt 2
       
       
        return cMagazyn;
    }
    return cMagazyn;
}

W pkt 1 (patrz na kod wyżej) dane są prawidłowo pobierane i ładowane do wektora np.
Samsung - index 0 wektora
Sony - index 1 wektora
LG index 2 wektora

W pkt 2 czyli zaraz po wyjściu z pętli while ten sam wektor zawiera już nie te same dane mianowicie
będzie to:
LG - index 0 wektora
LG - index 1 wektora
LG - index 2 wektora

Co może być przyczyną, że dane wektora się zmieniają.

Dodam, że  po dokonaniu zmiany w tej funkcji - przeniesienie tworzenia obiektów klas do pętli while

powoduje, że dane w wektorze są takie same po odczycie w pkt1 i pkt2:

C/C++
QVector < Magazyn > & MagazynDao::ReadMagazynFromFile()
{
    if( cMagazyn.size() > 0 )
         cMagazyn.clear();
   
    magazyn->SetNazwa( "Dom" ); //było magazyn->SetNazwa(cModelName)
   
    QFile file( "./Magazins/" + QString( magazyn->GetNazwa() + ".mag" ) );
    if( file.exists() )
    {
        file.open( QIODevice::ReadOnly );
       
        QDataStream in( & file );
        in.setVersion( QDataStream::Qt_5_10 );
        int i = 0;
        while( !in.atEnd() )
        {
            Gabaryt * gabaryt = new Gabaryt();
            Towar * towar = new Towar( gabaryt );
            Magazyn * magazyn = new Magazyn( towar );
           
            in >> * magazyn;
            cMagazyn.push_back( * magazyn );
           
            qDebug() << cMagazyn[ i ].GetTowar().GetProducer() << " - " << i; //pkt 1
            i++;
        }
       
        file.close();
       
        for( int i = 0; i < cMagazyn.size(); i++ )
             qDebug() << cMagazyn[ i ].GetTowar().GetProducer(); //pkt 2
       
       
        return cMagazyn;
    }
    return cMagazyn;
}

Pozdrawiam
P-171941
pekfos
» 2018-07-23 22:50:33
Wszystkie twoje magazyny wskazują na ten sam obiekt Towar.
P-171942
Kefirek
Temat założony przez niniejszego użytkownika
» 2018-07-23 23:38:31
Zgadza się.
P-171943
« 1 »
  Strona 1 z 1