Wzajemne zaprzyjaźnianie funkcji składowych klas

0

Czy jest możliwe wzajemne zaprzyjaźnienie funkcji składowych klas? Chodzi mi o coś takiego:

 class C1{
    public:
    friend void C2::g(C1*wsk);
    void f(C2*wsk);
}
class C2{
    public:
    friend void C1::f(C2*wsk);
    void g(C1*wsk);
}

Teraz C1::f(C2wsk) jest przyjacielem klasy C2, ale żeby C2::g(C1wsk) była przyjacielem C1, przed definicją C1 powinna być zadeklarowana klasa C2, co jest niemożliwe z uwagi na odniesienia z wnętrza C2 do C1. Czy jest więc możliwość zadeklarowania przed definicją C1 tylko funkcji C2::g(C1*wsk), oczywiście po deklaracji klasy C1?

0
  1. w tym przykładzie friendy są niepotrzebne, bo i tak wszystko masz public
  2. przebuduj kod tak by uniknąć zapętlonej zależności.
0

Lub można tak:

 class C2; //- deklaracja wyprzedzająca
 class C1{
    public:
    friend void C2::g(C1*wsk);
    void f(C2*wsk);
}
class C2{
    public:
    friend void C1::f(C2*wsk);
    void g(C1*wsk);
}
0

Ale można tak:

class C1{
    public:
    friend class C2;
    void f(C2*wsk);
}
class C2{
    public:
    friend class C1;
    void g(C1*wsk);
}

Aczkolwiek wydaje mi się że potrzebujesz jedynie:

class C2;
class C1{
    public:
    void f(C2*wsk);
}
class C2{
    public:
    void g(C1*wsk);
}
0

Pomyliłem się, funkcje składowe nie miały być publiczne. O ile dobrze zrozumiałem, konstrukcja jaką chciałem zbudować nie ma prawa bytu w C++ i trzeba przynajmniej jedną klasę zaprzyjaźnić w całości?
Czy takie ograniczenie jest podyktowane jakimś realnym logicznym problemem czy tylko chęcią uproszczenia kompilatora (umożliwienie jednoprzebiegowej analizy kodu pod kątem przyznawania praw dostępu)?

0

Kwestia kompilacji jest bardziej złożona.
W sumie wystąpienie konieczności rozwiązywania cyklicznych zależności najprawdopodobniej świadczy o błędzie projektowym i trzeba coś w tej kwestii poprawić

0

Opisz do czego potrzebujesz tak dziwnego zabiegu a powiemy jak to zrobić beż użycia cyklicznego zaprzyjaźnienia.
Na dzień dobry możesz zrobić trzeci obiekt zaprzyjaźniony z tymi dwoma w którą będą obie metody.

0

Jeszcze do niczego. Uczę się C++ i zainteresowała mnie kwestia cyklicznego zaprzyjaźniania. Ten przypadek nie był opisany w podręczniku, nijak nie mogłem zmusić kompilatora do przełknięcia takiego kodu, w Google nic nie udało mi się znaleźć, więc postanowiłem zapytać na forum. Chodzi wyłącznie o poznanie możliwości i ograniczeń.

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