[C++] Składniki klasy+zapis

0

Witam!

Spróbuje krótko wyjaśnić swój problem:

Otóż stworzyłem klasę szlifierka:

class szlifierka
{
      private:
              string producent;
              string model;
              string kolor;
              
              silnik c_silnik;
              tarcza *c_tarcza;
              
              static int licz_szlif;
              
                            
      public:
                           
              szlifierka(string, string, string, int, bool, tarcza* =0);
              ~szlifierka();
              
              void montuj();
              void zdejmij();
              
              void drukuj();
              void zapis(ostream &sv);
              void odczyt(istream &ld);      
              
};

Dokładnie chodzi mi o metody zapis(ostream &sv), odczyt(istream &ld). Metody te mają zapisywać do pliku dane klasy (te private). Podczas testowania programu zauwazyłem ze jezeli nie zapisze do pliku (nie wywołam metody zapis), to moge wczytać dane i wyświetlic je na ekranie. Jak to mozliwe? odczytać cos czego sie nie zapisało :-[ ?! Oto metoda zapisu:

void szlifierka::zapis(ostream &sv)
{
     if(!c_tarcza)
     { 
                  sv<< producent<<" "
                        << model<< " "
                        << kolor<<"\n";
     }else{
           sv<< producent<<" "
             << model<< " "
             << kolor<<" "
             <<c_tarcza->nazwa_tarczy<<"\n";
          }   
      cout<<"!Skladniki klasy szlifierka zapisane do pliku!\n\n";
}

A to odczytu:

void szlifierka::odczyt(istream &ld)
{
     if(!c_tarcza)
     { 
                  ld>>kolor>>model>>producent;
     }else{
           ld>>c_tarcza->nazwa_tarczy>>kolor>>model>>producent;
          }     
          
          
       
      cout<<"!Skladniki klasy szlifierka wczytane z pliku!\n";
      cout<<"Producent: "<< producent<<endl;
      cout<<"Model: "<< model<<endl;
      cout<<"Kolor: "<< kolor<<endl;
      if(!c_tarcza){cout<<endl;};
      if(c_tarcza){
      cout<<"Rodzaj Tarczy: "<<c_tarcza->nazwa_tarczy<<endl<<endl;
                  };
                  
} 

Prosze o pomoc, googlowałem to wiele razy ale nic ciekawego nie znalazłem.

0

Klasę masz tylko z jednym konstruktorem, który wymusza podanie argumentów, czyli żeby wczytać dane szlifierki musisz jej najpierw te dane podać.
Po drugie, przy wczytywaniu sprawdzasz czy jakaś tarcza jest podpięta do c_tarcza, ale przecież to chyba masz dopiero wczytać z pliku czy jest/czy jej nie ma.
No i po 3. Jeżeli plik nie istnieje a ty spróbujesz coś wczytać to w tym wypadku klasa Szlifierka będzie miała dane takie jak podałeś w konstruktorze. Jeżeli dobrze rozumuję :-)

0
valmico napisał(a)

Klasę masz tylko z jednym konstruktorem, który wymusza podanie argumentów, czyli żeby wczytać dane szlifierki musisz jej najpierw te dane podać.
Po drugie, przy wczytywaniu sprawdzasz czy jakaś tarcza jest podpięta do c_tarcza, ale przecież to chyba masz dopiero wczytać z pliku czy jest/czy jej nie ma.
No i po 3. Jeżeli plik nie istnieje a ty spróbujesz coś wczytać to w tym wypadku klasa Szlifierka będzie miała dane takie jak podałeś w konstruktorze. Jeżeli dobrze rozumuję :-)

Bardzo dobrze wyjaśniłeś to co wiem :-P

W mainie to ja sobie tworze obiekty poprzez ten konstruktor.

Co do punktu 2, tu racja, to jest bez sensu.

Punkt 3: no i tu tkwi problem.

Zależy mi zeby ktoś mi podsunął pomysł jak to zrealizować poprawnie. Funkcja zapisuje mi dobrze (chyba) ale wczytywanie mocno kuleje :/

0

ftims?

wiesz w ogole czemu sluzy (de)serializacja i jakie sa jej zalozenia?

  1. jesli zapisujesz STAN obiektu, to pownienes go zapisac JEDNOZNACZNIE. spojrz na swoj zapis. uzywasz <<blah<<" ". co bedzie jesli 'producent' bedzie sie nazywal "ala ma kota a kot ma x-x" ? skad przyszly odczytujacy bedzie wiedzial gdzie konczy sie producent a zaczyna model?
  2. nalezy zapisac CALY potrzebny do odtworzenia stan, a nie fragment. w ::odczyt uzywasz if(c_tarcza) zeby warunkowo wczytac tak-albo-siak. skad to c_tarcza sie bierze? z zewnatrz? konstruktor je tworzy? co jesli konstruktor stworzy a plik nie bedzie zawierac danych tarczy? co jesli konstruktor nie stworzy a plik bedzie zawieral dane tarczy? po co konstruktor mialby robic z tarcza cokolwiek skoro plik to tresc pliku to nadpisze? skad odczytywacz mialby wiedziec co nadpisac skoro nigdzie w pliku nie ma informacji czy jest tarcza czy nie?

do przemyslenia.. :
jak zapisac/odczytac stringa zeby miec pewnosc gdzie sie konczy
jak odczytywac, zeby 'odczytywacz' byl w stanie odtworzyc wszystko
jak napisac konstruktory/odczytywacza zeby sie nie gryzly /choc, w zasadzie, nigdy nie powinny byly/

//ftims - a tak mi sie skojarzylo ze znajomym rocznikiem z uczelni.. akurat to przerabiaja

0

ftims-nie czaje

nie wiem co to (de)serializacja?
http://www.parashift.com/c++-faq-lite/serialization.html

spocznix, chyba musze sie 'skonsultować z jakimś zrodłem' bo nie wiem o czym do mnie mówisz ;-P

a tarcza jest zakładana przez osobną metode klasy głównej (albo jest albo nie ma, zalezy od moich potrzeb)

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