#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Produs{
protected:
int pret, cantitate, id;
public:
friend istream & operator>> (istream &is, Produs &p);
friend ostream & operator<< (ostream &os, Produs &p);
virtual string getTipProdus() {return "produs";};
void setId(int _id) {
id = _id;
}
virtual void print();
};
void Produs::print() {
cout << *this;
}
istream & operator>> (istream &is, Produs &p) {
cout << "introdu pretul produsului: " << endl;
cin >> p.pret;
cin.ignore();
cout << "introdu cantitatea produsului:" << endl;
cin >> p.cantitate;
cin.ignore();
return is;
}
ostream & operator<< (ostream &os, Produs &p) {
cout << "Produsul are pretul " << p.pret << " si cantitatea " << p.cantitate << ", fiind de tipul " << p.getTipProdus() << endl;
return os;
}
class Dvd: public Produs {
private:
int nrminute;
public:
string getTipProdus() override {
return "dvd";
}
friend istream & operator>> (istream &is, Dvd &d);
friend ostream & operator<< (ostream &os, Dvd &d);
void print() override;
};
void Dvd::print() {
cout << *this;
}
istream & operator>> (istream &is, Dvd &d) {
is >> (Produs&)d;
cout << "introdu durata, in minute: " << endl;
cin >> d.nrminute;
cin.ignore();
return is;
}
ostream & operator<< (ostream &os, Dvd &d) {
os << (Produs&)d;
cout << "Acest " << d.getTipProdus() <<" are o durata de " << d.nrminute << " minute ";
return os;
}
class MusicDvd: public Dvd {
private:
string interpreti;
string numeAlbum;
public:
friend istream & operator>> (istream &is, MusicDvd &md);
friend ostream & operator<< (ostream &os, MusicDvd &md);
string getTipProdus() override {
return "DVD de muzica";
}
void print()override;
};
void MusicDvd::print() {
cout << "fooofff" << endl;
cout << *this;
}
istream & operator>> (istream &is, MusicDvd &md) {
is >> (Dvd&)md;
cout << "specifica interpretii: " << endl;
getline(cin, md.interpreti);
cout << "introdu numele albumului: " << endl;
getline(cin, md.numeAlbum);
return is;
}
ostream & operator<< (ostream &os, MusicDvd &md) {
os << (Dvd&)md;
cout << ", interpretii sunt " << md.interpreti << " iar numele albumului este " << md.numeAlbum << endl;
return os;
}
class FilmDvd: public Dvd {
private:
string gen;
string numeFilm;
public:
friend istream & operator>> (istream &is, FilmDvd &fd);
friend ostream & operator<< (ostream &os, FilmDvd &fd);
string getTipProdus() override {
return "DVD film";
}
};
istream & operator>> (istream &is, FilmDvd &fd) {
is >> (Dvd&)fd;
cout << "specifica genul filmului: " << endl;
getline(cin, fd.gen);
cout << "introdu numele filmului: " << endl;
getline(cin, fd.numeFilm);
return is;
}
ostream & operator<< (ostream &os, FilmDvd &fd) {
os << (Dvd&)fd;
cout << ", genul filmului este " << fd.gen << " iar numele acestuia este " << fd.numeFilm << endl;
return os;
}
class Carte: public Produs {
private:
string titlu;
string autori;
string editura;
public:
friend istream & operator>> (istream &is, Carte &c);
friend ostream & operator<< (ostream &os, Carte &c);
string getTipProdus() override {
return "carte";
}
};
istream & operator>> (istream &is, Carte &c) {
is >> (Produs&)c;
cout << "introdu titlul cartii: " << endl;
getline(cin, c.titlu);
cout << "introdu autorii cartii: " << endl;
getline(cin, c.autori);
cout << "introdu editura cartii: " << endl;
getline(cin, c.editura);
return is;
}
ostream & operator<< (ostream &os, Carte &c) {
cout << "Cartea are titlul " << c.titlu << ", este scrisa de " << c.autori << " si este publicata de editura " << c.editura << endl;
return os;
}
class ObiectColectie: public Produs {
private:
string denumire;
public:
friend istream & operator>> (istream &is, ObiectColectie &o);
friend ostream & operator<< (ostream &os, ObiectColectie &o);
string getTipProdus() override {
return "obiect de colectie";
}
};
istream & operator>> (istream &is, ObiectColectie &o) {
is >> (Produs&)o;
cout << "Introdu denumirea produsului: " << endl;
getline(cin, o.denumire);
return is;
}
ostream & operator<< (ostream &os, ObiectColectie &o) {
os << (Produs&)o;
cout << "Acest " << o.getTipProdus() << " se numeste " << o.denumire;
return os;
}
class Figurina: public ObiectColectie {
private:
string categorie;
string brand;
string material;
public:
string getTipProdus() override {
return "figurina";
}
friend istream & operator>> (istream &is, Figurina &f);
friend ostream & operator<< (ostream &os, Figurina &f);
};
istream & operator>> (istream &is, Figurina &f) {
is >> (ObiectColectie&)f;
cout << "introdu categoria: " << endl;
getline(cin, f.categorie);
cout << "introdu brandul: " << endl;
getline(cin, f.brand);
cout << "introdu materialul: " << endl;
getline(cin, f.material);
return is;
}
ostream & operator<< (ostream &os, Figurina &f) {
os << (ObiectColectie&)f;
cout << ", este de categorie " << f.categorie << ", facut de brandul " << f.brand << " si din materialul " << f.material << endl;
return os;
}
class Poster: public ObiectColectie {
private:
string format;
public:
string getTipProdus() override {
return "poster";
}
friend istream & operator>> (istream &is, Poster &p);
friend ostream & operator<< (ostream &os, Poster &p);
};
istream & operator>> (istream &is, Poster &p) {
is >> (ObiectColectie&)p;
cout << "introdu formatul: " << endl;
getline(cin, p.format);
return is;
}
ostream & operator<< (ostream &os, Poster &p) {
os << (ObiectColectie&)p;
cout << " si are formatul" << p.format << endl;
return os;
}
class Librarie {
private:
int numarProduse;
vector<Produs> produse;
public:
friend istream & operator>> (istream &is, Librarie &lib);
friend ostream & operator<< (ostream &os, Librarie &lib);
int getNumarProduse() {
return numarProduse;
}
vector<Produs>& getProduse() {
return produse;
}
};
istream & operator>> (istream &is, Librarie &lib) {
cout << "Cate produse are libraria? " << endl;
cin >> lib.numarProduse;
cin.ignore();
int i;
for (i = 1; i <= lib.numarProduse; i++) {
cout << "introdu tipul produsului(dvd, carte sau obiect de colectie) " << endl;
string tip;
getline(cin, tip);
if (tip == "dvd") {
cout << "specifica tipul de DVD(muzica/film)" << endl;
getline(cin, tip);
if (tip == "muzica") {
MusicDvd md;
is >> md;
md.setId(i);
lib.produse.push_back(md);
} else {
if (tip == "film") {
FilmDvd fd;
is >> fd;
fd.setId(i);
lib.produse.push_back(fd);
} else {
i--;
cout << "Eroare, input invalid. Incercati din nou." << endl;
}
}
} else {
if (tip == "obiect de colectie") {
cout << "specifica tipul de obiect de colectie(figurina/poster)" << endl;
getline(cin, tip);
if (tip == "figurina") {
Figurina f;
is >> f;
f.setId(i);
lib.produse.push_back(f);
} else {
if (tip == "poster") {
Poster p;
is >> p;
p.setId(i);
lib.produse.push_back(p);
} else {
i--;
cout << "Eroare, input invalid. Incercati din nou." << endl;
}
}
} else {
if (tip == "carte") {
Carte c;
is >> c;
c.setId(i);
lib.produse.push_back(c);
} else {
i--;
cout << "Eroare, input invalid. Incercati din nou." << endl;
}
}
}
}
return is;
}
ostream & operator<< (ostream &os, Librarie &lib) {
int i;
for (i = 0; i < lib.numarProduse; i++) {
os << lib.produse[i];
}
return os;
}
class Menu {
public:
void ListOptions() {
cout << "Alegeti una dintre optiuni: " << endl;
cout << "1. afisarea tuturor produselor " << endl;
cout << "2.editarea unui produs " << endl;
cout << "3. ordonarea crescatoare dupa pret " << endl;
cout << "4. cautarea unei carti dupa titlu " << endl;
cout << "5. afisarea produselor cu cea mai mare cantitate posibila " << endl; //scrie produsului acolo dar daca e egalitate nu scrie vreo regula deci amandoua
cout << "6. sfarsire program " << endl;
}
int ChooseOption(int l, int r, Librarie &lib) {
int i = 0;
while (i < l || i > r) {
ListOptions();
cout << "Alegi optiunea: " << endl;
cin >> i;
cin.ignore();
if (i < l || i > r) {
cout << "Optiune invalida, incercati din nou" << endl;
}
}
return i;
}
void option1(Librarie &lib) {
int n = lib.getNumarProduse();
vector<Produs> &produse = lib.getProduse();
int i;
for (i = 0; i < n; i++) {
Produs& pp = produse[i];
string tip;
tip = pp.getTipProdus();
cout << tip << endl << pp.print();
}
}
void MainLoop(Librarie &lib) {
while (true) {
int option = ChooseOption(1, 4, lib);
if (option == 1) {
option1(lib);
} else if (option == 2) {
//option2(lib);
} else if (option == 3) {
//option3(lib);
} else if (option == 4) {
//option4(lib);
} else if (option == 5) {
//option5(lib);
} else {
break;
}
}
cout << '\n' << "---------------------------------" << '\n' << "Program incheiat";
}
};
int main()
{
Librarie lib;
cin >> lib;
Menu meniu;
meniu.MainLoop(lib);
return 0;
}
The code above basically has a menu and implements a "produs" - product class that has 3 subclasses: dvd, carte and ObiectColectie. Dvd and objectcolectie also have 2 subclasses each. I added a virtual function in Produs for writing, overridden in dvd and in dvdmuzica(dvd subclass), so if i put in an input for this it should print out the data. Given that this is not in english, an input that works is:
1
dvd
muzica
5
3
2
john
jazz
However the GetTipProdus() method does not return anything but "produs" all the time -- it should return a string equivalent to the lowest subclass this product is part of. What did i do wrong?