• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

ofstream i przeładowanie operatora <<

Object Storage Arubacloud
0 głosów
213 wizyt
pytanie zadane 29 stycznia 2019 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)

Chcę zapisać dane na temat obiektu do pliku tekstowego za pomocą przeładowanego operatora. Znalazłem pewien LINK w którym autor z tym samym problemem ma rzekomo dobrze napisane funkcje, tyle że coś się nie kompiluje. Po skonstruowaniu tego co poniżej widać otrzymuję komunikat (poniżej oznaczyłem która linijka się wykłada) :

"invalid initialization of reference of type 'std::ofstream& {aka std::basic_ofstream<char>&}' from expression of type 'std::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}'|"

Definicja klasy

class Kasa{
    friend ofstream & operator << (ofstream & out, Kasa & obiekt);
    
    float stan_kasy;
    int dzien;
    int miesiac;
    int rok;
    int godzina;
    int minuta;
public:
    void sprzedaz();
    void zwrot();
    void zapisz_stan(Kasa & obiekt);
    Kasa(float stan);
    ~Kasa();
};

Definicja funkcji

//W PLIKU .h
ofstream & operator << (ofstream & out, Kasa & obiekt);

//W PLIKU .cpp
ofstream & operator << (ofstream & out, Kasa & obiekt){
   /*tutaj wyrzuca błąd >>*/ return out << obiekt.stan_kasy<<" "<< obiekt.dzien<<" "<<obiekt.miesiac<<" "<<obiekt.rok<<" "<<obiekt.godzina<<" "<<obiekt.minuta<<" "<<endl;
}

Wywołanie w metodzie klasy Kasa

void Kasa::zapisz_stan(Kasa & obiekt){
    SYSTEMTIME st;
    GetSystemTime(&st);
    obiekt.godzina = st.wHour;
    obiekt.minuta = st.wMinute;
    ofstream plik("kasa.txt");
    plik.open("kasa.txt", ios::in);
    plik << obiekt;
    plik.close();
}

 

1
komentarz 30 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
To trochę pomylone by tworzyć strumień std::ofstream a później prosić go o przyjmowanie danych przez std::ios::in. Po co to in jeśli piszesz DO strumienia a nie czytasz Z strumienia?

BTW. friend także radził bym unikać. To zła praktyka.
1
komentarz 30 stycznia 2019 przez j23 Mędrzec (194,920 p.)
void Kasa::zapisz_stan(Kasa & obiekt)
{
    ...
    plik << obiekt;
    ...
}

Dziwne to. Po co ta metoda zapisuje stan innego obiektu?

1 odpowiedź

+1 głos
odpowiedź 29 stycznia 2019 przez adrian17 Ekspert (344,860 p.)
Przeładowane operatory powinny brać i zwracać ostream& (to klasa bazowa), nie ofstream&.

BTW, nie musisz ręcznie wywoływać close(), destruktor zrobi to za Ciebie.

Podobne pytania

0 głosów
0 odpowiedzi 345 wizyt
pytanie zadane 8 maja 2021 w C i C++ przez krzysiu99 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 803 wizyt
pytanie zadane 17 września 2017 w C i C++ przez StillLearning Nowicjusz (200 p.)
0 głosów
0 odpowiedzi 284 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...