Agregacja - jak sobie z tym poradzić?

0

Witam jako nowicjusz na forum. Piszę program na zaliczenie służący do podstawowej obsługi sklepu. Zatrzymałem się na obsłudze sprzedaży w momencie dodawania do paragonu pozycji. Na tę chwilę funkcja wygląda tak:

void Kasa::sprzedaz(Kasa & obiekt, Magazyn & obiekt2){
    string nazwa;
    Towar * towar;
    vector <Towar> paragon;
    paragon.clear();
    
    if(obiekt.stan_kasy == 0){
        obiekt.zasilek_kasowy();
        cout<<"Wplacono zasilek kasowy - stan kasy 300.00 zl"<<endl;
    }
    
    while(true){
        system("cls");
        cout << "|-----------------KASA - SPRZEDAZ-----------------|" << endl;
        cout << "| 1. DODAJ POZYCJE DO PARAGONU                    |" << endl;
        cout << "| 2. USUN OSTATNIA POZYCJE Z PARAGONU             |" << endl;
        cout << "| 3. ZAPLAC                                       |" << endl;
        cout << "|-------------------------------------------------|" << endl;
        
        cout<<"\nPARAGON:"<<endl;
        if(paragon.empty() == false){
            for(int i = 0; i < paragon.size(); i++){
                cout<<paragon[i].nazwa_tow<<" "<<"Ilosc: "<<paragon[i].ilosc<<endl;
            }
        }
        else cout<<"Brak pozycji na paragonie"<<endl;

        cin<<akcja;

        switch(akcja){
            case 1://DODAJ POZYCJE DO PARAGONU
                {
                    obiekt2.wyswietl_magazyn();
                    cout<<"Wprowadz nazwe towaru dodawanego do paragonu"<<endl;
                    cin>>nazwa;
                    nazwa = male_litery(nazwa);
                    if(obiekt2.czy_jest_w_magazynie(nazwa)==true){//sprawdz czy jest w magazynie
                        
                        for(int i = 0; i < magazyn.size(); i++){//jezeli jest
                                if(magazyn[i].nazwa == nazwa){
                                    towar = magazyn[i];//ustaw wskaznik towar na tej pozycji
                                    break;
                                }
                            }
                            
                            cout<<"Wprowadz ilosc"<<endl;
                            cin>>ile;
                            if(towar->ilosc >= ile){ //sprawdz czy jest wystarczajaca ilosc towaru na stanie
                                
                                //TUTAJ SIĘ ZATRZYMAŁEM
                            } 
                            else cout<<"Brak wystarczajacej ilosci towaru na stanie"<<endl:
                            
                            
                            
                            
                        };
                    else cout<<"Brak towaru o takiej nazwie"<<endl;
                    system("pause");
                }
            case 2:
                {

                }
            case 3:
                {

                }

            }

    }
}

Jak rozwiązać problem z wieloma pozycjami na paragonie? W wymaganiach projektu jest zawarta m.in agregacja więc to chyba najlepszy punkt do jej wykorzystania by obiekt klasy Paragon zawierał pozycje które są obiektami klasy Towar. No I w sumie to na tyle, bo nie mam żadnego sensownego pomysłu co dalej. Funkcja sprzedaż najpierw zbiera informacje o przyszłym paragonie, pozycje przechowuje w tymczasowym wektorze, a po zapłaceniu tworzy obiekt klasy Paragon i wrzuca go do wektora w obiekcie klasy Baza_dokumentow. Podobnie zamierzałem zrobić z Fakturą która będzie wystawiana na podstawie Paragonu. Nie przemyślałem że okaże się to w tym miejscu takie skomplikowane dla mnie i trochę tak jakbym się porwał z motyką na słońce. Jakieś pomysły?

Definicja dokumentow:

class Baza_Dokumentow{

    class Dokument{
        public:
        virtual void dodaj_dokument()=0;
        };
    //----------------------------
    //KLASA ZAGNIEZDZONA PARAGON
    class Paragon :public Baza_Dokumentow::Dokument{
        int nr_paragonu;
        string data;
        int wartosc;
        vector <Towar> pozycje;
        Paragon();
        ~Paragon();

    public:
        virtual void dodaj_dokument();

    };
    //----------------------------
    //KLASA ZAGNIEZDZONA FAKTURA
    class Faktura :public Baza_Dokumentow::Dokument{

    };
    //----------------------------
};

definicja Towaru

class Towar {
    friend class Magazyn;
    friend class Kasa;
    string nazwa_tow;
    int ilosc;
    int indeks_tow;
    float cena_tow;
public:
    Towar(const string, int, const int, float);
    ~Towar();

};

0

Za dużo zajęło ci zrzędzenie (opis bez wartości technicznej), a za mało jest wyjaśnienia na czym polega problem.
Z początku myślałem, że nie używasz std::vector, ale raczej to nie jest twój problem. Wyjaśnij czemu std::vector nie jest wstanie rozwiązać problemu wielu pozycji na paragonie.

Najprawdopodobniej nie ogarniasz problemu, bo UI masz wymieszany z logiką, a logika nie jest jasno podzielona. Piszesz za duże funkcje i dlatego nie jesteś w stanie ogarnąć.
Zanim zaczniesz zastanawiać się nad architekturą aplikacji naucz się pisać mniejsze funkcje (dzielić większe funkcje na mniejsze problemy).

Poza tym, wszyscy używają pojęcia "koszyk" (zakupów) do zarządzania towaru. Paragon jest generowany, po zatwierdzeniu zamówienia, na podstawie zawartości koszyka.

0
Alan K. napisał(a):
void Kasa::sprzedaz(Kasa & obiekt, Magazyn & obiekt2){

Skoro metoda sprzedaz należy do klasy Kasa, to po Ci referencja do innej kasy jako parametr? Możesz po prostu odwoływać się do składowych klasy bez tej referencji lub użyć wskaźnika this.
Nadawanie różnym parametrom nazw obiekt i obiekt2 nic nie wnosi, a tylko pogarsza czytelność kodu.

Alan K. napisał(a):
        cin<<akcja;

cin to strumień wejściowy - należy użyć operator >>.

Alan K. napisał(a):
                        for(int i = 0; i < magazyn.size(); i++){//jezeli jest

Skąd tu wziąłeś zmienną magazyn? Czy nie chodzi tu przypadkiem o obiekt2? Takie są właśnie efekty nieodpowiedniego nazewnictwa.

Alan K. napisał(a):
                                    towar = magazyn[i];//ustaw wskaznik towar na tej pozycji

Skoro towar jest wskaźnikiem, to trzeba przypisać do niego adres obiektu, a nie wartość.
Przydałoby się też odpowiednio nazwać, że chodzi o towar w magazynie.

towar_w_magazynie = &magazyn[i];
Alan K. napisał(a):
                                //TUTAJ SIĘ ZATRZYMAŁEM
if (towar_w_magazynie->ilosc >= ile) { //sprawdz czy jest wystarczajaca ilosc towaru na stanie
    Towar towar; // Tworzymy obiekt
    // Pobieramy dane o towarze z magazynu
    towar.nazwa_tow = towar_w_magazynie->nazwa_tow;
    towar.indeks_tow = towar_w_magazynie->indeks_tow;
    towar.cena_tow = towar_w_magazynie->cena_tow;
    towar.ilosc = ile; // Ilość towaru na paragonie
    paragon.push_back(towar); // Dodajemy towar do paragonu
    towar_w_magazynie->ilosc -= ile; // Zmniejszamy ilość towaru w magazynie
}

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