2016-03-23 9 views
1

In folgendem Code:Multiple Ebene Freundschaft

class B { 
    int x; 
    int y; 
}; 

class A { 
    friend class Other; 
    friend class A; 
    int a; 
    B* b; 
public: 
    A(){ b = new B();} 
}; 

struct Other { 
    A a; 
    void foo() { 
     std::cout << a.b->x; // error 
    } 
}; 

int main() { 
    Other oth; 
    oth.foo(); 
} 

Die angegebene Zeile nicht mit:

t.cpp:22:19: error: 'x' is a private member of 'B' 
std::cout << a.b->x; 
       ^
t.cpp:7:5: note: implicitly declared private here 
int x; 

Warum Freundschaft funktioniert nicht, wenn sie von Klassenmitglied zu anderem Klassenmitglied bezieht?

+2

Nun, 'Other' ist kein 'Freund' von' Klasse B', daher kann dort nicht auf den privaten 'B :: x' zugegriffen werden. –

+0

Wenn eine Antwort für Sie funktioniert hat, [markieren Sie sie als akzeptiert] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). Wenn dies nicht der Fall war, fügen Sie einen Kommentar hinzu, in dem Sie um Klärung oder Korrekturen gebeten werden (falls erforderlich). – Nacho

Antwort

2

dieser Zeile:

std::cout << a.b->x; 

beinhaltet ein eigenes Mitglied A (b) und ein eigenes Mitglied B (x) innerhalb der Klasse Zugriff auf Other. Während A Zugriffsrechte auf Other gab, tat B nicht, daher der Fehler. Wenn Sie diese arbeiten wollen, müssen Sie hinzufügen:

class B { 
    friend class Other; 
}; 

Side-Note, diese Erklärung ist bedeutungslos:

class A { 
    friend class A; 
}; 

Eine Klasse hat bereits Zugang zu seinen eigenen Mitgliedern . Es ist überflüssig, es als eigenen Freund zu bezeichnen.

0

Try this:

class B{ 
friend class Other; 
int x; 
int y; 
}; 
+1

Code-only-Antworten sind nicht hilfreich. Sie sollten artikulieren * warum * OP sollte dies versuchen. Was macht was du gemacht hast, während was OP Fehler gemacht hat? – Barry

2

Obwohl dies eine seltsame Verwendung von friend s ist, gehe ich davon aus es zu Lernzwecken ist. Das heißt, sollten Sie Ihre friends Definition wie folgt beheben:

class B{ 
    friend class Other; // Because you access private member x from Other::foo() 
    int x; 
    int y; 
}; 

class A{ 
    friend class Other; // Because you access private member b from Other::foo() 
    int a; 
    B* b; 
public: 
    A(){ b = new B();} 
}; 

struct Other{ 
    A a; 
    void foo(){ 
     // Access A's private member b 
     // Access B's private member x 
     std::cout << a.b->x; 
    } 
};