2009-05-16 8 views
1

Je sais qu'il est possible de créer une fonction ami en C++:Est-il possible de créer une "classe d'amis" en C++?

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

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

Mais est-il un moyen de créer des classes d'ami? NB: Je sais qu'il y a probablement beaucoup d'erreurs dans ce code, je n'utilise pas de fonctions ami et je suis encore assez nouveau dans la langue; s'il y en a, dites-moi s'il vous plaît.

Répondre

7

Eh oui - dans la déclaration de class Box, font

friend class SomeOtherClass; 

Toutes les fonctions membres de SomeOtherClass pourront accéder au membre contents (et tout autre membre privé) de toute Box.

+0

et je suppose que pour définir la SomeOtherClass, vous écris juste "SomeOt herClass {public: int someothercontents;}; " en dehors de la déclaration Box? –

+0

@ Keand64: SomeOtherClass sera une classe correctement définie, donc oui, vous faites tout ce que vous avez fait pour définir la classe Box. –

2

Par ailleurs, une ligne directrice de conception est que, si une classe est suffisamment proche pour être déclaré un ami, alors il est assez proche d'être déclaré en tant que classe imbriquée dans le même fichier d'en-tête, par exemple:

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

Si vous ne voulez pas déclarer l'autre classe comme une classe imbriquée dans le même fichier d'en-tête, alors vous ne devriez peut-être pas le déclarer comme un ami.

0

Dans votre code, vous utilisez actuellement les membres de la boîte « contenu » en tant que membre statique dans la fonction add (boîte :: contenu = num;)

Vous devez soit déclarer le contenu comme étant statique, comme si : (vous devez également initialiser alors ..)

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

int box::contents; 

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

ou, changez la fonction d'ajout d'accepter un objet de boîte et un int:

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

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