2009-05-16 21 views
1

Ich weiß, es ist möglich, eine Friend-Funktion in C++ zu erstellen:Ist es möglich, eine "Freund-Klasse" in C++ zu erstellen?

class box 
{ 
friend void add(int num); 
private: 
int contents; 
}; 

void add(int num) 
{ 
box::contents = num; 
return; 
} 

Aber ist es eine Möglichkeit zu schaffen Freund Klassen?

NB: Ich weiß, dass es wahrscheinlich eine Menge Fehler in diesem Code gibt, ich benutze keine Friend-Funktionen und bin immer noch ziemlich neu in der Sprache; Wenn es welche gibt, sag es mir bitte.

Antwort

7

Yup - in der Erklärung von class Box, tun

friend class SomeOtherClass; 

Alle Member-Funktionen von SomeOtherClass in der Lage, das contents Mitglied (und alle anderen privaten Mitglieder) aller Box zuzugreifen.

+0

und ich nehme an, dass die SomeOtherClass zu definieren, Sie schreibe einfach "SomeOt herClass {public: int someothercontents;}; " außerhalb der Box Erklärung? –

+0

@ Keand64: SomeOtherClass wird eine richtig definierte Klasse, also ja, Sie tun, was Sie getan haben, um Klasse Box zu definieren. –

2

By the way, eine Design-Richtlinie ist, dass, wenn eine Klasse nahe genug ist, einen Freund erklärt wird, dann ist es nahe genug, um als geschachtelte Klasse in der gleichen Header-Datei deklariert werden, zum Beispiel:

class Box 
{ 
    class SomeOtherClass 
    { 
    //some implementation that might want to access private members of box 
    }; 
    friend class SomeOtherClass; 
private: 
    int contents; 
}; 

Wenn Sie die andere Klasse nicht als geschachtelte Klasse in derselben Header-Datei deklarieren möchten, sollten Sie sie vielleicht nicht (obwohl Sie dazu in der Lage sind) als Freund deklarieren.

0

In Ihrem Code, den Sie verwenden derzeit das Kastenelement ‚Inhalt‘ als statisches Element in der Add-Funktion (box :: Inhalt = num;)

Sie sollten entweder erklären Inhalte als statisch zu sein, wie so : (Sie können es auch dann initialisiert werden müssen ..)

class box 
{ 
    friend void add(int num); 
    private: 
     static int contents; 
}; 

int box::contents; 

void add(int num) 
{ 
    box::contents = num; 
    return; 
} 

oder Ihre Add-Funktion ändern, um ein Box-Objekt und einen int zu akzeptieren:

class box 
{ 
    friend void add(box *b, int num); 
    private: 
     int contents; 
}; 

void add(box *b, int num) 
{ 
    b->contents = num; 
    return; 
} 
Verwandte Themen