Why do I get the next memory error: (0xC0000005)?

-1

I am trying to implement a small C++ application, which manages a store's products and batches of products. It's kind of silly, but it is not something professional, I'm just practicing for my next exam at university, which has this kind of specific. So, I have three kinds of products: at promotion(ProdusPromo), perishable(ProdusPerisabil), and both at promotion and perishable(Produs TOT). I have one more class named Lot (Batch) which contains a pointer to Product, day, month and year (zi, luna, an) of acquisition and quantity of the specified product. Moreover, I have a singleton class named "Manager" which helps me add a new product, or a spefic batch of a product (adaugaLot). The problem is, that when I am trying to add two consecutive batches of the same type of product (Per for example), I get the next error: Process returned -1073741819 (0xC0000005).

#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

template <class T>
void isPositive(T value)
{
    if (value < 0) throw std::runtime_error("Nu poate fi negativ !\n");
}

class IO
{
public:
    virtual void citire(istream&) = 0;
    virtual void afisare(ostream&) = 0;

    friend istream& operator >>(istream& in, IO& ob)
    {
        ob.citire(in);
        return in;
    }
    friend ostream& operator <<(ostream& out, IO& ob)
    {
        ob.afisare(out);
        return out;
    }

    virtual ~IO() {}
};
class Produs: public IO{
    string uM;
    string nume;


public:
    Produs(string _uM = "", string _nume = ""): uM(_uM), nume(_nume){}
    ~Produs(){}
    void citire(istream&);
    void afisare(ostream&);
};

void Produs::citire(istream& in){
    cout << "Introduceti u.m: ";
    in >> uM;
    cout << "Introduceti numele produsului: ";
    in >> nume;
}

void Produs::afisare(ostream& out){
    out << "u.m: " << uM << "\n";
    out << "Numele produsului: " << nume << "\n";
}

class ProdusPromo: virtual public Produs{
protected:

       double discount;
public:
        ProdusPromo(string _uM = "", string _nume = "", double _discount = 0.0):
             Produs(_uM = "", _nume = ""), discount(_discount){}

    void afisare(ostream &out){
       Produs::afisare(out);
       out << "Discount: " << discount << "\n";
    }

    void citire(istream& in){
        Produs::citire(in);
        cout << "Dati discount-ul: ";
        in >> discount;
    }

    ~ProdusPromo(){}
};

class ProdusPerisabil: virtual public Produs{
protected:
       int valabilitate;
public:
        ProdusPerisabil(string _uM = "", string _nume = "", int _valabilitate = 0):
             Produs(_uM , _nume), valabilitate(_valabilitate){}

    void afisare(ostream &out){
       Produs::afisare(out);
       out << "Valabilitate: " << valabilitate << "\n";
    }

    void citire(istream& in){
        Produs::citire(in);
        cout << "Dati valabilitatea: ";
        in >> valabilitate;
    }

    ~ProdusPerisabil(){}
};

class ProdusTOT: public ProdusPerisabil, ProdusPromo
{
public:
    ProdusTOT(string _uM = "", string _nume = "", int _valabilitate = 0, double _discount = 0.0):
        Produs(_uM, _nume),
        ProdusPerisabil(_uM, _nume, _valabilitate),
        ProdusPromo(_uM, _nume, _discount){}

    ~ProdusTOT(){}

    void citire(istream& in){
        ProdusPromo::citire(in);
        cout << "Introduceti perioada de valabilitate: ";
        in >> valabilitate;
    }

    void afisare(ostream& out){
        ProdusPromo::afisare(out);
        out << "Valabilitatea: " << valabilitate << "\n";
    }

};

class Lot: public IO{
    Produs* prod;
    int zi;
    string luna;
    string an;
    int cantitate;

public:
    Lot(Produs* _prod = new Produs(), int _zi = 1, string _luna = "1", string _an = "1990", int _cantitate = 0):
        prod(_prod), zi(_zi), an(_an), cantitate(_cantitate){}
    ~Lot(){
        delete prod;
    }
    void citire(istream& in){
        string tip;
        cout << "Tip produs [Per, Prom, PromPer] ";
        cin >> tip;
    try {
        if (tip == "Per")
            prod = new ProdusPerisabil;
        else if (tip == "Prom")
            prod = new ProdusPromo;
        else if (tip == "PromPer")
            prod = new ProdusTOT;
        else throw runtime_error("Tip invalid!\n");
    }
    catch (const exception& ex) {
        cout << ex.what();
        return;
    }
    in >> (*prod);
    cout << "Introduceti ziua: ";
    in >> zi;
    cout << "Introduceti luna: ";
    in >> luna;
    cout << "Introduceti anul: ";
    in >> an;
    cout << "Introduceti cantitatea: ";
    in >> cantitate;
    }

    void afisare(ostream& out){
        out << "Produsul:\n" << *prod << "\n";
        out << "Cantitatea: " << cantitate << "\n";
        out << "Data: " << to_string(zi) + "-" + luna + "-" + an << "\n";
    }
};


class Manager
{

    vector <Produs*> produse;
    vector <Lot> loturi;

    static Manager* instance;
    Manager() {}
    Manager(const Manager& ob) = delete;// si liniile acestea cu delete tot din laborator<3
    Manager(Manager&& ob) noexcept = delete;
    Manager& operator=(const Manager& ob) = delete;
    Manager& operator=(Manager&& ob) = delete;
public:
    static Manager* getInstance() {
        if (instance == nullptr) return new Manager();
        return instance;
    }

    void addProdus();
    void listareProduse();
    void adaugaLot();
    void listareLot();
};
void Manager::adaugaLot(){
    Lot L;
    cin >> L;
    loturi.push_back(L);
}

void Manager::listareLot(){
    for (unsigned i = 0; i < loturi.size(); ++i)
        cout << (loturi[i]) << "\n";

}

void Manager::addProdus()
{
    string tip;
    Produs* p = nullptr;
        cout << "Type of product [Per, Prom, PromPer] ";
        cin >> tip;
    try {
        if (tip == "Per")
            p = new ProdusPerisabil;
        else if (tip == "Prom")
            p = new ProdusPromo;
        else if (tip == "PromPer")
            p = new ProdusTOT;
        else throw runtime_error("Invalid!\n");
    }
    catch (const exception& ex) {
        delete p;
        cout << ex.what();
        return;
    }
    cin >> (*p);

    produse.push_back(p);
}

void Manager::listareProduse(){
    for(unsigned i = 0; i < produse.size(); ++i){
        cout << (*produse[i]) << "\n";
    }
}
Manager* Manager::instance = nullptr;

int main()
{
    Manager* M = M->getInstance();
    int op = 1;
    while(1){
        cout << "introduceti optiunea:\n ";
        cout << "1. add Product\n";
        cout << "2. lis Products\n";
        cout << "3. add Batcn\n";
        cout << "4. list Batch\n";
        cin >> op;
        if (op == 1)
            M->addProdus();
        else if(op == 2)
            M->listareProduse();
        else if(op == 3)
            M->adaugaLot();
        else if(op == 4)
            M->listareLot();
        else break;
        }
    return 0;

    }

So, if you press 3 in the menu and add a Per product, and after that you press 3 again and add a Per product you will get that error.

c++
inheritance
upcasting
asked on Stack Overflow May 27, 2021 by Johnny

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0