Pomoc z kodem

0

Witam. Może mi ktoś podpowiedzieć czemu w konstruktorach Dysku i monitora nie mogę nadać nowej wartości zmiennej "cena"? Dostaje komunikat że Produkt::cena jest niedostępna. Dziękuję z góry za odpowiedź. :)

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Produkt {//klasa abstrakcyjna
    float cena;
public:
    virtual string opis() = 0; //metoda czysto wirtualna - abstrakcyjna
    float get_cena() {
        return cena;
    }
    Produkt() {}
};
class Dysk :public Produkt {
    int pojemnosc;
public:
    string opis() { return "Dysk, pojemnosc " + to_string(pojemnosc) + ", cena: " + to_string(get_cena()); }
    Dysk(int pojemnosc, float cena) : pojemnosc(pojemnosc), cena(cena) {}
};
class Monitor :public Produkt {
    double przekatna;
public:
    string opis() { return "Monitor, przekatna " + to_string(przekatna) + ", cena: " + to_string(get_cena()); }
    Monitor(double przekatna, float cena) : przekatna(przekatna), cena(cena) {}
};
0

Zmienna cena jest prywatna. Zmień na protected:

0

Ponieważ cena jest prywatna.

0
TomaszLiMoon napisał(a):

Zmienna cena jest prywatna. Zmień na protected:

Po zmianie wyrzuca dalej bład:

E0292   element "cena" nie jest niestatycznym elementem członkowskim danych ani klasą bazową klasy "Dysk"
Błąd    C2614   „Dysk”: Niedozwolone inicjowanie składowej: „cena” nie jest obiektem bazowym ani składową   
0

Dodaj konstruktor Produkt(float cena); (może być protected) i na listach inicjalizacyjnych klas pochodnych wywołuj (na początku) Produkt(cena).

1

Przenieś inicjalizację ceny do wnętrza konstruktora.

Dysk(int pojemnosc, float cena) : pojemnosc(pojemnosc) { this->cena = cena; }

Jeżeli dalej chcesz zainicjalizować tą zmienną w liście inicjalizacyjnej powinieneś to zrobić konstruktorem z klasy bazowej.

0
TomaszLiMoon napisał(a):

Przenieś inicjalizację ceny do wnętrza konstruktora.

Dysk(int pojemnosc, float cena) : pojemnosc(pojemnosc) { this->cena = cena; }

Jeżeli dalej chcesz zainicjalizować tą zmienną w liście inicjalizacyjnej powinieneś to zrobić konstruktorem z klasy bazowej.

Racja! Dziękuję bardzo!

0

Bez naruszania enkapsulacji:

class Produkt {
    float cena;

public:
    virtual string opis() = 0;

    float get_cena()
    {
        return cena;
    }

    explicit Produkt(float cena)
        : cena(cena)
    {
    }
};

class Dysk : public Produkt {
    int pojemnosc;

public:
    string opis() { 
        return "Dysk, pojemnosc " + to_string(pojemnosc) + ", cena: " + to_string(get_cena());
    }

    Dysk(int pojemnosc, float cena)
        : Produkt(cena)
        , pojemnosc(pojemnosc)
    {
    }
};

class Monitor : public Produkt {
    double przekatna;

public:
    string opis() { 
         return "Monitor, przekatna " + to_string(przekatna) + ", cena: " + to_string(get_cena());
    }

    Monitor(double przekatna, float cena)
        : Produkt(cena)
        , przekatna(przekatna)
    {
    }
};

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