Dlaczego program się wysypuje? polimorfizm

0

Chce sobie zrobić tablicę/koszyk w której będe skłądował klasy.
ale program się wysypuje jeśli 3 razy dam funkcję Sprzedaj_Zawartosc_Koszyka()

#include <iostream>
using namespace std;

class Towar {
protected:
    string nazwa;

public:
    virtual void sprzedaj();

    Towar(string nazwa)
        : nazwa(nazwa)
    {
        //    sprzedaj();
    }

    virtual ~Towar()
    {
        cout << "Destruktor Towar\n";
    }
};

void Towar::sprzedaj()
{
    cout << "Sprzedarz " << nazwa << endl;
}

class Towar_Spozywczy : public Towar {
protected:
    string termin_waznosci;

public:
    void sprzedaj();
    Towar_Spozywczy(string nazwa, string waznosc)
        : Towar(nazwa)
        , termin_waznosci(waznosc){};
};

void Towar_Spozywczy::sprzedaj()
{
    Towar::sprzedaj();
    cout << ".Sprawdzenie terminu przydatnosci do spozycia\n";
}

class Towar_z_Gwarancja : public Towar {
protected:
    string podbicie_gwarancji;

public:
    void sprzedaj();
    Towar_z_Gwarancja(string nazwa, string podbicie_gwarancji)
        : Towar(nazwa)
        , podbicie_gwarancji(podbicie_gwarancji){};
};

void Towar_z_Gwarancja::sprzedaj()
{
    Towar::sprzedaj();
    cout << ".Podbicie gwarancji\n";
}

class Koszyk {
public:
    int i;
    Towar* koszyk[10];

    Koszyk(int i = 0){};
    void Dodaj_Towar_do_Koszyka(Towar*);
    void Sprzedaj_Zawartosc_Koszyka();
};

void Koszyk::Dodaj_Towar_do_Koszyka(Towar* towar)
{
    if (i <= 9) {
        koszyk[i] = towar;
        ++i;
    }
}
void Koszyk::Sprzedaj_Zawartosc_Koszyka()
{
    if (i >= 0) {
        --i;
        koszyk[i]->sprzedaj();
    }
}

int main(int argc, char** argv)
{

    Towar towarek1("jablko");
    Towar_Spozywczy towarek2("pomarancza", "10.11.2017");
    Towar_z_Gwarancja towarek3("sok", "3.11.1997");
    Koszyk koszyk1;
    koszyk1.Dodaj_Towar_do_Koszyka(&towarek1);
    koszyk1.Dodaj_Towar_do_Koszyka(&towarek2);
    koszyk1.Dodaj_Towar_do_Koszyka(&towarek3);
    koszyk1.Sprzedaj_Zawartosc_Koszyka();
    koszyk1.Sprzedaj_Zawartosc_Koszyka();
    koszyk1.Sprzedaj_Zawartosc_Koszyka();  //

    return 0;
}

3

Nie inicjalizujesz i w klasie Koszyk.

0

A teraz czemu?

class Koszyk {
public:
    int i;
    Towar** koszyk;

    Koszyk(int i = 0):i(i){
		koszyk = new Towar*[10];
	};
    void Dodaj_Towar_do_Koszyka(Towar*);
    void Sprzedaj_Zawartosc_Koszyka();
};

void Koszyk::Dodaj_Towar_do_Koszyka(Towar* towar)
{
    if (i <= 9) {
        koszyk[i] = towar;
        ++i;
    }
}
void Koszyk::Sprzedaj_Zawartosc_Koszyka()
{
    if (i >= 0) {
        --i;
        koszyk[i]->sprzedaj();
        delete koszyk[i];
    }
}
0

Jeśli reszta bez zmian, próbujesz wywołać delete na obiekcie o automatycznym czasie życia, nieutworzonym przez new

1

A tak konkretniej, próbując trochę powróżyć to pisząc tak:

Towar** koszyk;
 
Koszyk(int i = 0):i(i){
   koszyk = new Towar*[10];
};

Chciałeś chyba osiągnąć coś takiego

Towar* koszyk;
 
Koszyk(int i = 0):i(i){
   koszyk = new Towar[10];
};
0

Użyj std::vector oraz Smart pointerow z c11

Problemy znikną

1

Przenoszę komentarze do wątku, dla kontekstu cytaty z komentarzy

no nie, poza tym to nie zadziała - bartekpage 23 minuty temu
no matching function for call to 'Towar::Towar()' - bartekpage
Treść błędu jest dość wymowna. - several 14 minut temu
no a ja go nie rozumiem - bartekpage 14 minut temu
a gdzie ja wywoluje funkcjie, to bez sensu - bartekpage 4 minuty temu

Zadziała zadziała, właśnie dlatego, że poprawnie zacząłeś inicjalizować tą tablice dostałeś ten błąd. Klasa Towar ma zdefiniowany jeden konstruktor konwertujący Towar(string nazwa) a to oznacza, że kompilator nie wygeneruje niejawnych konstruktorów. W takim przypadku musisz sam dodać jawną definicje domyślnego konstruktora:

Towar() = default;
Towar(string nazwa);

Z tym jakże krótkim kodem są jeszcze inne problemy, nawet zacząłem je wyłuszczać, ale widząc odpowiedzi autora w tym wątku stwierdzam, że szkoda czasu.

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