Dostęp do zmiennej prywatnej klasy bazowej

0

Mam taki program i przez konstruktor robię dostęp do provate float r, ale nie działa. Jeśli dam protected to jest ok, Jednak to chodz o to żeby to "r" było prywatne. Ne wiem gdzie robię błąd.

#include <iostream>
#include <math.h>

using namespace std;

class Kolo
{
    float r,x,y;
    string nazwa;
public:
    void wyswietl()
    {
        cout<<"Jest to koło "<<nazwa<<" o promieniu"<<r<<endl;
        cout<<"Œrodek koła ("<<x<<","<<y<<")"<<endl;
        cout<<"Powierzchnia tego ko³a wynosi: "<<M_PI*r*r<<endl;
    }

    Kolo(string n="Felga",float promien=1,float a=1,float b=1)
    {
    nazwa =n;
    r=promien;
    x=a;
    y=b;
    }
};

class Kula:public Kolo
{
    string nazwa;

public:
    void wyswietl()
    {
        cout<<"Kula o nazwie "<<nazwa<<endl;

        cout<<"Ob Kuli to :"<<M_PI*3/4*r*r*r<<endl;
    }
    Kula(string nk="pilka",float promien=8,float a=0,float b=0)
    :Kolo(nk,promien,a,b)
    {
        string name = nk;
    }

};
int main()
{
    setlocale(LC_ALL,"");

    cout << "Hello world!" << endl;
    Kula k1("pilka",4,1,2);
    k1.wyswietl();
    return 0;
}
0

Kula dziedziczy publicznie, a więc nie ma dostępu do prywatnych składowych koła. Zaprzyjaźnij kulę z kołem, a będziesz mieć dostęp.

2

Dziedziczenie opisuje relację "is a". Kula nie jest kołem, dziedziczenie nie powinno tu być zastosowane bo nie ma sensu.

Z opisu problemu wynika, że masz problem XY: próbujesz na siłę dopasować (błędne) rozwiązanie do problemu.

0
Mariusz Bombarello napisał(a):

Mam taki program i przez konstruktor robię dostęp do provate float r, ale nie działa. Jeśli dam protected to jest ok,

I prawidłowo działa:

  • Private: The class members declared as private can be accessed only by the functions inside the class. They are not allowed to be accessed directly by any object or function outside the class. Only the member functions or the friend functions are allowed to access the private data members of a class.
  • Protected: Protected access modifier is similar to that of private access modifiers, the difference is that the class member declared as Protected are inaccessible outside the class but they can be accessed by any subclass(derived class) of that class.

https://www.geeksforgeeks.org/access-modifiers-in-c/

Mariusz Bombarello napisał(a):

Jednak to chodz o to żeby to "r" było prywatne. Ne wiem gdzie robię błąd.

Zgaduję: prowadzącemu chodzi o użycie gettera?

2

Te dziedzicznie wygląda podejrzanie.
Robisz coś nie tak.
Tka jak Kq podejrzewam problem XY:

  1. masz problem z czymś innym
  2. ubzdurałeś sobie jakieś dziwne rozwiązanie
  3. prosisz by naprawić to rozwiązanie, które jest niepoprawne dla tego problemu
  4. tymczasem powinieneś pytać jak rozwiązać problem w poprawny sposób.
1

Bracie @Mariusz Bombarello opowiedz, chwilowo bez żadnego kodu, jaki efekt chciałbyś uzyskać. A także, jakie dane będziesz miał na wejściu programu, a jakie mają być na wyjściu.

0

Problem rozwiałem przez zrobienie
||->float r,x,y;string nazwa;<-|| protected
Jeśli przestawię bloki kodu to też zaczyna działać. Jednak nie wiem po odwoływać się do tej wartość skoro jest tyle pisania, a mogę zadeklarować nową zmienną . Druga i ta sama rzecz to po co mi zmienne private do której nie ma nikt dostępu

1
Mariusz Bombarello napisał(a):

Druga i ta sama rzecz to po co mi zmienne private do której nie ma nikt dostępu

Nie ma dostępu nikt poza uprawnionymi, czy klasą jaka zdeklarowała je jako private, oraz klasami/funkcjami friend.
Natomiast po co to - no właśnie dokładnie po to, aby nikt niepowołany w prywatnych składnikach klasy nie grzebał. Wyobraź sobie, że twoja klasa potrzebuje zestawu zmiennych, odpowiednio zainicjalizowanych w określonej kolejności, i mająca powiązania między nimi. Spędziłeś sporo czasu aby to do kupy poskładać aby działało zgodnie z twoją intencją, nadebugowałeś się nielicho, potworzyłeś testy jednostkowe, i wymyśliłeś publiczne/protected API które gwarantuje poprawność zachowania obiektu zapobiegając przy tym możliwości popełnienia błędu przez użytkownika klasy.
Teraz jakbyś nie miał składników prywatnych to ktoś dziedzicząc twoją klasę, i niewłaściwie używając składników które poprzednio były prywatne najprawdopodobniej spowodowałby chaos, a następnie przybiegł zawracać ci dupę czemu jego klasa nie działa. A tak to nie może, i jest zmuszony korzystać ze składników protected/public, które jeśli o to się zatroszczyłeś nie pozwolą mu zrobić czegoś niepoprawnego.

0

Najprostsze rozwiązanie, dodać kod do klasy Kolo i użyć w klasie pochodnej:

public:
float getR() const {return r;}
float getX() const {return x;}
float getY() const {return y;}
void setR(float r) {this-> r = r;}
void setX(float x) {this-> x = x;}
void setY(float y) {this-> y = y;}

Po to używamy klas w C++, żeby mieć obiekty :) .

0

Już wszystko wiem. Jak zwykle było to bardziej proste niż byłem w stanie to w pierwszej chwili sobie wyobrazić. Prywatny to prywatny i tyle, tak po prostu, a mi się wydawało, że muszę mieć potem do tego dostęp.

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