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

[C++] Czy można i jak zrobić operator przeładowania wypisujący z listy obiekty klasy

Ostatnio zmodyfikowano 2022-05-29 06:47
Autor Wiadomość
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?

C/C++
#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;
}
P-179451
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
C/C++
for( int i = 0; i < nazwa_kontenera.size(); ++i )
{
   
if( wybranydeser == tablicadodatkow[ i ].nazwa )
   
{
       
// cos tam wykonuje
       

Mam problem z wypisaniem takich obiektów z listy.
mogło by to wyglądać np. tak
C/C++
ostream & operator <<( ostream & wyjscie, const Dodatek & listadodatkow )
{
   
wyjscie << listadodatkow.nazwa << " " << listadodatkow.cenaBrutto << " " << listadodatkow.stawkaVAT << '\n';
   
return wyjscie;
}

w main
C/C++
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 = { czekolada, orzechy, bezcukru };
   
//DodajDadatki( dodatki, tablicadodatkow, 3 );
   
   
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
P-179452
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.

P-179465
« 1 »
  Strona 1 z 1