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

Tworzenie funkcji i zaprzyjaźnianie klas

Object Storage Arubacloud
0 głosów
122 wizyt
pytanie zadane 31 marca 2020 w C i C++ przez MaTiDxxx Początkujący (290 p.)

Witam, jako iż nie uzyskałem odpowiedz i na poprzednie pytanie zawarte https://forum.pasja-informatyki.pl/478152/tworzenie-klas-konstruktorow-funkcji-i-friend postanawiam krok po kroku zadawać pytania.

Czy jest możliwość stworzenia funkcji zewnętrznej i zaprzyjaźnienia jej z dwiema lub więcej różnymi klasami bez konieczności wkładania funkcji do klasy? 

class Pierwsza
{
    public:
        friend class Druga; 
        friend void dodajAiB();
    private:
        int wartoscA;
        Pierwsza(int x) : wartoscA(x) {}
};
 
class Druga
{
    public: 
        friend class Pierwsza;  
        friend void dodajAiB();
    private:
        int wartoscB;
        Druga(int y)
        {
            wartoscB = y;
        }
};
 
void dodajAiB(Pierwsza& wartoscA, Druga& wartoscB)
{
    int suma;
    suma = Pierwsza.wartoscA + Druga.wartoscB;
}
 

Probowałem tutaj to w jakiś sposób zrobić ale ciągle wyskakuja błędy.

1 odpowiedź

0 głosów
odpowiedź 31 marca 2020 przez mokrowski Mędrzec (155,460 p.)

Składniowo, tak. W sens tego kodu nie wnikam.

class Druga;

class Pierwsza
{
    public:
        friend class Druga;
        friend void dodajAiB(Pierwsza&, Druga&);
    private:
        int wartoscA;
        Pierwsza(int x) : wartoscA(x) {}
};

class Druga
{
    public:
        friend class Pierwsza;
        friend void dodajAiB(Pierwsza&, Druga&);
    private:
        int wartoscB;
        Druga(int y)
        {
            wartoscB = y;
        }
};

void dodajAiB(Pierwsza& wartoscA, Druga& wartoscB)
{
    // Nie wiem co chcesz tu wyprawiać
    //int suma;
    //suma = Pierwsza.wartoscA + Druga.wartoscB;
}

int main() {
}

PS. Zaprzyjaźnianie klas lub funkcji to ogólnie zła praktyka. Bywa także zabraniania w standardach tworzenia kodu. No ale rozumiem że masz się uczyć lub "kazano Ci".

komentarz 1 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)

Dlaczego zaprzyjaźnianie klas, to zła praktyka? 

to ogólnie zła praktyka

Moim zdaniem takie zdanie nie powinno mieć miejsca w informatyce, tak jak inie ma w medycynie. Wszystko zależy...

komentarz 1 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)
To zła praktyka bo dehermetyzuje klasę na funkcję/klasę, bazując wyłącznie na jej nazwie. Daje jej pełną kontrolę nad atrybutami tak, że mogą być łamane niezmienniki.

Strona 11, punkt 6.11 tabeli:

https://www.autosar.org/fileadmin/user_upload/standards/adaptive/17-03/AUTOSAR_RS_CPP14Guidelines.pdf

Przeskocz teraz do 142 strony, punktu 6.11.3 i przeczytaj co na ten temat sądzą JSF czy HIC++

Stona 30, reguła 70 A : http://www.stroustrup.com/JSF-AV-rules.pdf

Reguła 11.2.1 : https://www.perforce.com/resources/qac/high-integrity-cpp-coding-standard/member-access-control

AUTOSAR - standard tworzenia architektury systemu dla branży Automotive

JSF (Joint Strike Fighter Air Vehicle) - standard dla kodu awioniki samolotów bojowych

High Integrity C++ Coding Standard - tworzony i rozwijany przez community, jeden z dłużej dostępnych na rynku.
komentarz 1 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)

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

No. It does not. "Friend" is an explicit mechanism for granting access, just like membership. You cannot (in a standard conforming program) grant yourself access to a class without modifying its source.

https://softwareengineering.stackexchange.com/questions/105766/c-to-friend-or-not-to-friend

 

Podane style guide mają swoją renomę, ale jestem trochę niepewny co do takich rygorystycznych podjeść. Takie podejście nie wynika czasem z specyfikacji branży gdzie są stosowane? Jednak chodzi o ludzkie życie i wymogi na pewno powinny być bardziej zachowawcze. Co skutkuje lekko apodyktycznym zapędom. 

komentarz 1 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)
I dlatego napisałem "ogólnie zła praktyka". Np. google dopuszcza friend a nie pozwala na wyjątki. Ogólnie IMHO warto wiedzieć jakie jest stanowisko branży. W większości przypadków kodu produkcyjnego, friend jest traktowany jako niepożądany. W przypadku projektu krytycznego, kod który użyje friend po prostu nie przejdzie do builda bo statyczne sprawdzanie kodu go nie dopuści (np. MISRA). A żeby złamać zasadę, pisze się elaborat dlaczego i dopiero wtedy można wyłączyć w tej sekcji kodu sprawdzenie (co się oczywiście zdarza np. dla goto w C ... bo tam jest pewien przypadek gdzie jest ok). Czyli to nie jest w obszarze wyboru osoby programującej tudzież jej przekonań, tylko jest kodyfikowane odgórnie. Standardy powstały na podstawie badań nad kodem, zebranych błędów, naruszeń bezpieczeństwa, audytów istniejących systemów, błędów twórców kompilatorów,... Jeśli piszesz kod dla jakiegoś programu biurowego z GUI, robisz jak chcesz. Jeśli jednak to ma być system krytyczny, nie masz wyjścia :)
komentarz 1 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)
Właśnie, Twoją odpowiedź zrozumiałem jako "nie i kropka", a głównie rozchodzi mi się, że to zależy. Dzięki.

Podobne pytania

0 głosów
1 odpowiedź 1,077 wizyt
pytanie zadane 31 marca 2020 w C i C++ przez MaTiDxxx Początkujący (290 p.)
0 głosów
2 odpowiedzi 222 wizyt
0 głosów
2 odpowiedzi 505 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 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!

...