Zdefiniowanie operatora "+=" – potrzebne podpowiedzi

0

Witam, w klasie Koszyk mam zdefiniować operator+=, tak, aby możliwe było dodanie produktów do koszyka, nie mogę sobie z tym poradzić, jakieś podpowiedzi?

Moja biblioteka

#include <iostream>
#include <vector>

using namespace std;

class Produkt
{
    public:
    string nazwa;
    double cena;

    public:
    Produkt(string, double);
    ~Produkt();

    friend ostream& operator <<(ostream&, const Produkt&);
};

class Nabial : public Produkt
{
    double tluszcz;

    public:
    Nabial(string, double, double);
    ~Nabial();

    friend ostream& operator <<(ostream&, const Nabial&);
};

class Chemiczny : public Produkt
{
    string ostroznosc;

    public:
    Chemiczny(string, double, string);
    ~Chemiczny();

    friend ostream& operator <<(ostream&, const Chemiczny&);
};

class Spozywczy : public Produkt
{
    string termin;

    public:
    Spozywczy(string, double, string);
    ~Spozywczy();

    friend ostream& operator <<(ostream&, const Spozywczy&);
};

class Koszyk
{
    public:
    friend ostream& operator+=(ostream&, const &Koszyk);
};

biblioteka.cpp
#include "kasa.h"

Produkt::Produkt(string _nazwa, double _cena) : nazwa(_nazwa), cena(_cena)
{

}

Produkt::~Produkt()
{

}

Nabial::Nabial(string _nazwa, double _cena, double _tluszcz) : Produkt(_nazwa, _cena), tluszcz(_tluszcz)
{

}

Nabial::~Nabial()
{

}

Chemiczny::Chemiczny(string _nazwa, double _cena, string _ostroznosc) : Produkt(_nazwa, _cena), ostroznosc(_ostroznosc)
{

}

Chemiczny::~Chemiczny()
{

}

Spozywczy::Spozywczy(string _nazwa, double _cena, string _termin) : Produkt(_nazwa, _cena), termin(_termin)
{

}

Spozywczy::~Spozywczy()
{

}

ostream& operator<<(ostream& os, const Produkt &p)
{
    os << "cena: " << p.cena << "  nazwa produktu: " << p.nazwa << endl;

    return os;
}

ostream& operator<<(ostream& os, const Nabial &n)
{
    os << "cena: " <<  n.cena << "  nazwa: " << n.nazwa << "  zawartosc tluszczu: " << n.tluszcz << "%" << endl;

    return os;
}

ostream& operator<<(ostream& os, const Chemiczny &ch)
{
    os << "cena: " << ch.cena << "  nazwa: " << ch.nazwa << "  srodek ostroznosci: " << ch.ostroznosc << endl;

    return os;
}

ostream& operator<<(ostream& os, const Spozywczy &s)
{
    os << "cena: " << s.cena << "  nazwa: " << s.nazwa << "  data waznosci: " << s.termin << endl;

    return os;
}
0

Podpowiedź:

void operator+=(const Produkt &produkt);

jako składnik klasy Koszyk.

0

rozumiem, że chcesz wypisać zawartość swojej klasykoszyk, czy co? std::ostream jako operator przeciążający += ? to zły pomysł. Zmień to tak, aby zaprzyjaźniona metoda dodawała produkty do koszyka. Wydaje mi się, że w tym wypadku nie musi być zaprzyjaźniona, jeden argument wystarczy. Użyj this i będzie oks

2

Żeby nie powtarzać w kółko tego samego kodu w operator<< możesz użyć takiego czegoś:

ostream& operator<<(ostream& os, const Nabial& nabial)
{
  const Produkt& produkt(nabial);
  os << produkt;
  os << "     zawartosc tluszczu: " << nabial.tluszcz << "%";
  return os;
}
0
MasterBLB napisał(a):

Podpowiedź:

void operator+=(const Produkt &produkt);

jako składnik klasy Koszyk.

Ajaj, źle się wyraziłem, chcę aby mój koszyk przechowywał produkty, a dokładniej nabiały, chemiczne oraz spożywcze i wypisać ten koszyk. Czy chodzi o to, abym do każdego napisał ten operator?

void Koszyk::operator+=(const Nabial &n)
{
n.cena << n.nazwa << n.tluszcz;
}

void Koszyk::operator+=(const Spozywczy &s)
{
s.cena << s.nazwa << s.termin;
}

Czy da się to jakoś inaczej załatwić?

Jak powinno wyglądać wnętrze tej funkcji, aby dodać to do koszyka? Brakuje tam ewidentnie "zapisu".

0

Dobrze kombinuje?

void Koszyk::operator+=(const Produkt& produkt)
{
    new Produkt(produkt.nazwa, produkt.cena);
}

void Koszyk::operator+=(const Nabial& nabial)
{
 new Nabial(nabial.nazwa, nabial.cena, nabial.tluszcz);
}
0

Generalnie dobrze, ale tak, ale Nabiał to też Produkt. Tutaj tak jak ci Brat Delor podpowiada poczytaj o dziedziczeniu, funkcjach wirtualnych i polimorfizmie. Podpowiedź - nie potrzebujesz oddzielnej definicji operatora specjalnie dla nabiału jak dobrze to skonstruujesz.

A, i skoro chcesz także wypisywać zawartość koszyka, to przyda się przeciążenie operatora << dla klasy Koszyk.

0

Operator dla klasy Koszyk

ostream& operator<<(ostream& os, const Koszyk &kosz)
{
    os << kosz.nazwa << endl;

    return os;
}

Coś mi nie wychodzi..., w klasie Produkt dodałem:

virtual void operator+=(const Produkt&);

W Nabiale itd.:

void operator+=(const Nabial&);

.cpp:

void Produkt::operator+=(const Produkt &p)
{
    new Produkt(p.nazwa, p.cena);
}

void Nabial::operator+=(const Nabial &n)
{
    new Nabial(n.nazwa, n.cena, n.tluszcz);
}

Przeczytałem o polimorfizmie, virtualach, dziedziczeniu i nic :{ Co robię źle?

0
Turoczek napisał(a):
void Produkt::operator+=(const Produkt &p)
{ ... }

void Nabial::operator+=(const Nabial &n)
{ ... }

Chcesz dodawać Produkt do Produktu i Nabiał do Nabiału?

0

title

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