Jak dostać się do prywatnych atrybutów poza klasą?

0

Cześć, piszę mój pierwszy "większy" projekt obiektowo w c++ i chcę, aby użytkownik miał możliwość zmian, z klawiatury (cin?) atrybutów z klasy Kolo w funkcji main, jak to osiągnąć? Oto kod:

include <iostream>
#include "Figura.h"
#ifndef KULA_H
#define KULA_H

using namespace std;

class Kula : public Figura
{
private:
    float promien;
public:
    Kula(string n, float w, float r);
    virtual void pokazFigure();
    virtual void policzPole();
    virtual void policzObjetosc();
};
#endif // KULA_H
#include <iostream>
#include "Kula.h"
#include <cmath>

using namespace std;

Kula::Kula(string n, float w, float r) : Figura(w,n)
{
    promien = r;
}

void Kula::pokazFigure()
{
    cout<<"Twoja figura to "<<nazwa<<" o promieniu "<<promien<<endl;
}

void Kula::policzPole()     // P = 4*pi*r*r
{
    cout<<"Pole kuli wynosi: "<<4*M_PI*(pow(promien,2))<<endl;
}

void Kula::policzObjetosc()
{
    cout<<"Objetosc kuli wynosi: "<<(4/3)*M_PI*(pow(promien,3));
}
0

Dodam, że klasa Kolo publicznie dziedziczy z klasy wirtualnej Figura, ale to chyba widać w kodzie

1

Jak dostać się do prywatnych atrybutów poza klasą?

Prywatne składowe deklaruje się w tej sekcji właśnie po to, aby nie były widoczne poza klasą.

Jeśli potrzebujesz udostępnić dane z prywatnego pola na zewnątrz (i np. dodatkowo określić do nich dostęp lub wykonać dodatkowe czynności) to skorzystaj z właściwości.

4

Od tego są settery i gettery, ale przemyśl design. Pola prywatne są prywatne właśnie po to, aby użytkownik klasy w nich nie mieszał i używał wyłącznie ich publicznego interfejsu.

Nie widać z kodu nic, poza tym, że Figura jest klasą bazową. Jak chcesz zaznaczyć implementację interfejsu użyj override.

Swoją drogą, łamiesz SRP. Dlaczego klasa Kula jest odpowiedzialna za wypisywanie czegokolwiek do wyjścia standardowego? Dlaczego metoda licząca pole/powierzchnię nic nie zwraca?

0
kq napisał(a):

Od tego są settery i gettery, ale przemyśl design. Pola prywatne są prywatne właśnie po to, aby użytkownik klasy w nich nie mieszał i używał wyłącznie ich publicznego interfejsu.

Nie widać z kodu nic, poza tym, że Figura jest klasą bazową. Jak chcesz zaznaczyć implementację interfejsu użyj override.

Swoją drogą, łamiesz SRP. Dlaczego klasa Kula jest odpowiedzialna za wypisywanie czegokolwiek do wyjścia standardowego? Dlaczego metoda licząca pole/powierzchnię nic nie zwraca?

Właśnie po napisaniu posta to samo do mnie doszło, w sumie temat do zamknięcia.

0

Dodam jeszcze, że pole powierzchni i obwód mogą być obliczane automatycznie po aktualizacji wartości takich jak np. promień (w setterze odpalać metodę liczącą), a wyniki mogą być dostępne poprzez właściwości tylko do odczytu (sam getter).

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