• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przyjaźnie klasy i funkcji innej klasy

Object Storage Arubacloud
+1 głos
869 wizyt
pytanie zadane 20 sierpnia 2017 w C i C++ przez Bazi Użytkownik (680 p.)

Witam mam problem z pracą domową z odcinka 4 obiektowego c++.  Dlaczego gdy linijkę 20 w pliku .h zamienię na friend class Prostokat to wszystko działa? Kompilator pokazuje mi to co w załączonym obrazku.

Nie da się za pomocą zaprzyjaźnionej metody dostać do atrybutów innej klasy? Tak jak pisałem gdybym zamienił na friend class Prostokat to by działało ale ja chciałbym zrozumieć dlaczego z tą zaprzyjaźnioną funkcją nie działa. Byłbym bardzo wdzięczny jakby ktoś to wytłumaczył.
 

#include <iostream>
#include "home.h"

using namespace std;

Punkt::Punkt(string n, float xx, float yy)
{
    nazwa=n;
    x=xx;
    y=yy;
}

void Punkt::pobierz()
{
    cout<<endl<<"Wprowadz kolejno nazwe, x, y: ";
    cin>>nazwa>>x>>y;
}

void Prostokat::pobierz()
{
    cout<<endl<<"Wprowadz kolejno nazwe, x, y, szerokosc, wysokosc: ";
    cin>>nazwa>>x>>y>>szerokosc>>wysokosc;
}

Prostokat::Prostokat(string n, float xx, float yy, float s, float w)
{
    nazwa=n;
    x=xx;
    y=yy;
    szerokosc=s;
    wysokosc=w;
}

void Prostokat::sedzia(Punkt k)
{
   if ((k.x>=x&&k.x<=x+szerokosc)&&(k.y>=y&&k.y<=y+wysokosc))
   {
       cout<<endl<<"TAK Punkt "<<k.nazwa<<" lezy w prostokacie: "<<nazwa<<endl;
   }
   else
   {
       cout<<endl<<"NIE, Punkt "<<k.nazwa<<" NIE lezy w prostokacie: "<<nazwa<<endl;
   }
}
#include <iostream>
#include "home.h"

using namespace std;

int main()
{
    Punkt p1;
    Prostokat p2;
    p2.sedzia(p1);
    return 0;
}


#include <iostream>

using namespace std;

class Punkt;

class Prostokat
{
    string nazwa;
    float x, y, szerokosc, wysokosc;

public:
    Prostokat(string="BCDE", float=0, float=0, float=4, float=2);
    void pobierz();
    void sedzia(Punkt k);
};

class Punkt
{
    friend void sedzia (Punkt k);
    string nazwa;
    float x, y;

public:
    Punkt(string="A", float=4, float=2);
    void pobierz();
};



​​​​
1
komentarz 20 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)
Fajnie że robisz te zadania i się angażujesz, ale przyjaźń w OOP jest czymś takim czego trzeba unikać. Łamie zasady hermetyzacji i doprowadza do otwarcia działających i bezpiecznych implementacji.
1
komentarz 20 sierpnia 2017 przez draghan VIP (106,230 p.)

Fajnie że robisz te zadania i się angażujesz, ale przyjaźń w OOP jest czymś takim czego trzeba unikać. Łamie zasady hermetyzacji i doprowadza do otwarcia działających i bezpiecznych implementacji.

To jest kwestia dyskusyjna. ;)

http://www.stroustrup.com/bs_faq2.html#friend

komentarz 20 sierpnia 2017 przez Bazi Użytkownik (680 p.)
Ehlert może i tak, ale zanim pójdę dalej w programowaniu obiektowym chciałbym zrozumieć chociaż podstawy tych przyjaźni. Ale dzięki za uwagę ;)

1 odpowiedź

+1 głos
odpowiedź 20 sierpnia 2017 przez draghan VIP (106,230 p.)
wybrane 20 sierpnia 2017 przez Bazi
 
Najlepsza

Żeby to zadziałało, musisz wskazać jeszcze klasę, do której przynależy dana metoda, bo w tej chwili mówisz kompilatorowi, że przyjacielem klasy Punkt jest jakaś zwykła funkcja void sedzia(Punkt k):

class Punkt
{
    friend void Prostokat::sedzia (Punkt k);
    string nazwa;
    float x, y;
 
public:
    Punkt(string="A", float=4, float=2);
    void pobierz();
};

Ale mam dla Ciebie wskazówkę: klasa Punkt z punktu widzenia funkcjonalności mogłaby spokojnie mieć składowe x i y publiczne. Nic nie daje Ci w tym momencie uczynienie ich prywatnymi. Punkt ma po prostu wskazywać jakieś współrzędne i nie ma za wiele sensu w ukrywaniu tych współrzędnych. A jeśli już chciałbyś je ukrywać, dopisz metody dzięki którym będziesz mógł przynajmniej pobrać wartość tych zmiennych. Inaczej obiekty tej klasy będą mało użyteczne.

komentarz 20 sierpnia 2017 przez Bazi Użytkownik (680 p.)
Wielkie dzięki za odpowiedź :)

Podobne pytania

0 głosów
1 odpowiedź 204 wizyt
0 głosów
0 odpowiedzi 96 wizyt
pytanie zadane 7 września 2018 w C i C++ przez Raymond Nowicjusz (120 p.)
0 głosów
1 odpowiedź 653 wizyt
pytanie zadane 24 lipca 2018 w C i C++ przez Krutek Początkujący (330 p.)

92,568 zapytań

141,422 odpowiedzi

319,642 komentarzy

61,957 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...