OVH Cloud OVH Cloud

Classe non copiable et friend

22 réponses
Avatar
Fabien LE LEZ
Bonjour,

J'ai deux classes :
- une classe C, qui a un certain nombre de fonctions et
variables privées ;
- une classe F, qui doit légitimement avoir accès à la
quasi-totalité des éléments privés de C. Je la déclare donc amie :

class C
{
...
friend class F;
...
};

Jusque-là, rien d'exceptionnel -- c'est rare que j'utilise "friend",
mais dans mon cas ça se justifie.

Maintenant, je souhaite que C soit non-copiable. La méthode canonique
est de déclarer privés le constructeur de copie et l'opérateur =.
Seulement voilà, cette technique ne marche plus tout à fait, puisque F
a accès à ces fonctions privées.

Y a-t-il une solution élégante à ce problème, qui m'éviterait de
décréter qu'une classe non copiable n'a pas d'amies ?

Merci d'avance...



--
;-)

2 réponses

1 2 3
Avatar
nico
Du coup, j'aime avoir l'assurance que je n'appelle pas le constructeur
de copie par inadvertance.
Pourquoi ne pas le "désactiver" alors ? Il suffit de le déclarer en privé.


--
nico

Fabien LE LEZ wrote:
On Wed, 22 Dec 2004 20:35:01 +0100, drkm :

Elle peut de toute façon intervenir dans les
parties privées, le constructeur de copie n'étant qu'un point parmis
d'autres, que tu acceptes explicitement en la déclarant amie.


Certes. Mais le constructeur de copie peut parfois être appelé plus ou
moins implicitement (passage d'argument par valeur, ou valeur de
retour, d'une fonction template, par exemple), et ce genre de plan a
une désagréable tendance à créer des bugs difficiles à débusquer.
Du coup, j'aime avoir l'assurance que je n'appelle pas le constructeur
de copie par inadvertance.



Avatar
Fabien LE LEZ
On Thu, 30 Dec 2004 11:32:03 +0100, "nico" :

Pourquoi ne pas le "désactiver" alors ? Il suffit de le déclarer en privé.


Cf le message inital.



--
;-)

1 2 3