grigoriii Temat założony przez niniejszego użytkownika |
[C++] Czy można i jak zrobić operator przeładowania wypisujący z listy obiekty klasy » 2022-05-17 23:48:38 Hej, mam taki krótki kod w C++ i może źle myślę ale chciałbym się dowiedzieć czy mogę i jak wypisać obiekty klasy z listy? Mam klasę towar i klasę dziedziczącą dodatek, tworzę obiekty w klasie dodatek i wrzucam je na listę, wygląda że program działa. Mam problem z wypisaniem takich obiektów z listy. Pomyślałem o operatorze przeładowania który by mi to jakoś wyświetlił ale nie mam pojęcia jak to zrobić. Czy ktoś ma jakiś pomysł jak prawidłowo wypisać obiekty klasy z listy? #include <iostream> #include <iomanip> #include <array> #include <list> using namespace std;
class Towar { protected: string nazwa; double cenaBrutto; double stawkaVAT; public: Towar( string nazwa, double cenaBrutto, double stawkaVAT ) : nazwa( nazwa ) , cenaBrutto( cenaBrutto ) , stawkaVAT( stawkaVAT ) { } }; class Dodatek : public Towar { private: bool dodatekdolodow = false; bool dodatekdoshake = false; bool dodatekdogranita = false; public: Dodatek( string nazwa, double cenaBrutto, double stawkaVAT, bool dodatekdolodow, bool dodatekdoshake, bool dodatekdogranita ) : Towar( nazwa, cenaBrutto, stawkaVAT ) , dodatekdolodow( dodatekdolodow ) , dodatekdoshake( dodatekdoshake ) , dodatekdogranita( dodatekdogranita ) { } friend void WyswietlTabliceDodatkow( Dodatek tablicadodatkow[ ], string wybranydeser ); friend void DodajDadatki( list < Dodatek > listadodatkow, Dodatek tablicadodatkow[ ], int wybor ); friend ostream & operator <<( ostream & wyjscie, const list < Dodatek > listadodatkow ); }; void WyswietlTabliceDodatkow( Dodatek tablicadodatkow[ ], string wybranydeser ) { cout << "\n Wybierz dodatki\n"; int lp = 0; if( wybranydeser == "lody" ) { for( int i = 0; i < 3; i++ ) { if( tablicadodatkow[ i ].dodatekdolodow ) { cout << "\n\t" << " [" << ++lp << "] " << tablicadodatkow[ i ].nazwa; } } } else if( wybranydeser == "shake" ) { for( int i = 0; i < 3; i++ ) { if( tablicadodatkow[ i ].dodatekdoshake ) { cout << "\n\t" << " [" << ++lp << "] " << tablicadodatkow[ i ].nazwa; } } } else if( wybranydeser == "granita" ) { for( int i = 0; i < 3; i++ ) { if( tablicadodatkow[ i ].dodatekdogranita ) { cout << "\n\t" << " [" << ++lp << "] " << tablicadodatkow[ i ].nazwa; } } } cout << "\n\t [0] Powrót do poprzedniego menu \n"; cout << "\n\tPodaj swój wybór: \t"; } void DodajDadatki( list < Dodatek > listadodatkow, Dodatek tablicadodatkow[ ], int wybor ) { listadodatkow.push_front( tablicadodatkow[ wybor ] ); } ostream & operator <<( ostream & wyjscie, const list < Dodatek > listadodatkow ) { return wyjscie; } int main() { Dodatek czekolada( "Sos czekoladowy", 1, 0.23, 1, 0, 0 ); Dodatek orzechy( "Posypka orzechowa", 1, 0.23, 1, 1, 0 ); Dodatek bezcukru( "Bita śmietana bez cukru", 1, 0.23, 0, 0, 1 ); Dodatek tablicadodatkow[ ] = { czekolada, orzechy, bezcukru }; WyswietlTabliceDodatkow( tablicadodatkow, "lody" ); list < Dodatek > dodatki; DodajDadatki( dodatki, tablicadodatkow, 3 ); cout << dodatki; return 0; } |
|
nanoant20 |
» 2022-05-18 08:44:50 wygląda że program działa. ciężko się z tym zgodzić void WyswietlTabliceDodatkow( Dodatek tablicadodatkow[ ], string wybranydeser ) w powyższej funkcji brak interakcji z użytkownikiem to wszystko do wywalenia nie robi się takich warunków "if( wybranydeser == "lody" )" Pomyśl jakbyś miał 100 deserów to co 100 pętel i warunków? 1 pętla idzie przez całą tablice i jeden warunek coś w ten design pseudo schemat for( int i = 0; i < nazwa_kontenera.size(); ++i ) { if( wybranydeser == tablicadodatkow[ i ].nazwa ) { Mam problem z wypisaniem takich obiektów z listy. mogło by to wyglądać np. tak ostream & operator <<( ostream & wyjscie, const Dodatek & listadodatkow ) { wyjscie << listadodatkow.nazwa << " " << listadodatkow.cenaBrutto << " " << listadodatkow.stawkaVAT << '\n'; return wyjscie; }
w main int main() { Dodatek czekolada( "Sos czekoladowy", 1, 0.23, 1, 0, 0 ); Dodatek orzechy( "Posypka orzechowa", 1, 0.23, 1, 1, 0 ); Dodatek bezcukru( "Bita śmietana bez cukru", 1, 0.23, 0, 0, 1 ); list < Dodatek > dodatki = { czekolada, orzechy, bezcukru }; for( const auto & el: dodatki ) cout << el; return 0; }
//EDIT - powyżej postawiłem komentarz ponieważ w tej linijce DodajDadatki( dodatki, tablicadodatkow, 3 ); //2 nie 3 wychodzisz poza zakres tablicy i dostajesz komunikat std:: logic_error przejrzyj poniższy materiał cpp0x.pl Jak zbudowana jest klasa w C++ to są tylko moje sugestie to Twój projekt, więc musisz sobie sam przemyśleć jak to ma wyglądać i przebudować program |
|
grigoriii Temat założony przez niniejszego użytkownika |
» 2022-05-29 06:47:20 Dzięki za rzeczowe wyjaśnienie tematu, po Twojej odpowiedzi zakopałem się w kodzie i zeszło. Funkcja ostream, którą podpowiedziałeś dużo mi pomogła ruszyć dalej w programie.
Co do tej funkcji WyswietlTabliceDodatkow to racja nad nią muszę popracować, bo później przy rozbudowie takiego programu to kod się powtarza, zresztą już jest powtórzony(niestety)
Jak na razie to się jeszcze uczę, i jeszcze nie wszystko ogarniam, np. jakieś kontenery itp.
Dzięki jeszcze raz za pomoc.
|
|
« 1 » |