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 ?
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.
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 <usenet.fclcxx@fgeorges.org>:
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.
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.
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.
-- ;-)
On Thu, 30 Dec 2004 11:32:03 +0100, "nico" <spam@spam.spam>:
Pourquoi ne pas le "désactiver" alors ? Il suffit de le déclarer en privé.