Pomoc z kodem

AG
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:6
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ź. :)

Kopiuj
#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) {}
};
edytowany 1x, ostatnio: Adam Gajek
MarekR22
Tytuł "Pomoc z kodem" nie ma żadnej wartości? Z czym innym ktoś może mieć problem na forum dla programistów? Z gotowaniem zupy?
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 14 godzin
  • Postów:530
0

Zmienna cena jest prywatna. Zmień na protected:

MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:14 dni
  • Lokalizacja:Warszawa
  • Postów:1454
0

Ponieważ cena jest prywatna.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB
AG
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:6
0
TomaszLiMoon napisał(a):

Zmienna cena jest prywatna. Zmień na protected:

Po zmianie wyrzuca dalej bład:

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

edytowany 1x, ostatnio: Adam Gajek
Delor
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
0

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

TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 14 godzin
  • Postów:530
1

Przenieś inicjalizację ceny do wnętrza konstruktora.

Kopiuj
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.

AG
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:6
0
TomaszLiMoon napisał(a):

Przenieś inicjalizację ceny do wnętrza konstruktora.

Kopiuj
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!

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:11 minut
0

Bez naruszania enkapsulacji:

Kopiuj
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)
    {
    }
};

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
MasterBLB
Akurat bardzo słaby przykład bo wymusza niezmienność ceny
MarekR22
to wcale nie musi być wada (np programowanie funkcyjne). Dodanie setter-a to nie problem. Rozwiązanie wcześniejsze są strasznie koślawe.
MasterBLB
Znaczy się Bracie Marku aby Twoje rozwiązanie było w pełni koszerne to wystarczy dać float cena jako protected - jak w dalszych klasach potomnych zajdzie potrzeba zmiany ceny to nie będzie problemu z dopisaniem settera.
MarekR22
współdzielenie pól między klasami to zła praktyka.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.