-
PS: Beaucoup de classes liées à une ressources (ex: les flux) sont à la fois non-copiables et non-assignables. Ce qui me chagrine, c'est que trop souvent elles n'ont pas non plus d'implémentations/spécialisations de swap() alors qu'au niveau code, elles pourraient être swappables...
-
Et c'est là où le concept de "Move" intervient...
-
La forme canonique évoquée ici, son nom complet, c'est "forme canonique orthodoxe (de Coplien)", et elle ne s'applique qu'aux classes à sémantique de valeur.
Reste qu'il faudrait toujours expliciter la copie, même si c'est juste avec un commentaire pour dire "je ne fais rien, mais c'est fait exprès, la copie (/non-copie) par défaut est celle que je veux".
Au constructeur par défaut près, elle correspond à la règle du Big Three de M.C.Cline (je crois) (FAQ C++ lite). Sur artima, il y a un raffinement de la règle pour la faire tomber à 2, en profitant du RAII pour ne plus avoir à écrire le destructeur.
Pour en revenir aux questions initiales dès que j'ai une sémantique d'entité, je ne cherche même plus à supporter l'affectation, elle ne sert alors à rien.
Et dès que j'ai une hiérarchie polymorphe, je considère que je suis dans un cas de sémantique d'entité. Et donc, j'interdis l'affectation qui ne sert à rien.
Si je veux malgré tout des trucs hybrides, je pars sur des solutions compliquées (qui elles, marchent tout le temps sans tomber sur du slicing ; jouer avec l'opérateur d'affectation comme ce qu'il y avait dans ce fil finit toujours par montrer assez rapidement ses limites), à savoir l'idiome enveloppe-lettre (de Coplien toujours), ou sur des solutions façon Objets Réguliers de S.Parent & A.Stepanov (ils ont un papier qui montre (aussi) comment "régulariser" une entité: Sean Parent. “Beyond Objects”. Understanding The Software We Write. http://stlab.adobe.com/wiki/index.ph..._Presentations . C++ Connections. Nov 2005 ; accessible en passant par les documents non liés sur le wiki)
Parfois, j'accepte que les entités soient clonables (avec constructeur de copie protégé), mais c'est rare.
<pub>tout ça a donné un "wizard" pour vim qui demande la sémantique que l'on veut donner à une nouvelle classe</pub>
PS: les flux 0x seront "déplaçables", mais toujours pas copiables.
-
Pareil, quand j'ai une sémantique d'entité, je rends mes objets non-assignables, non-copiables par moyens conventionnels, et si je suis gentil je les rends clonables.
-
[HS]
Pardonnez mon ignorance mais qu'est ce qu'une classe à sémantique de valeur ou d'entité??
[/HS]
-
On dit d'une classe qu'elle a une sémantique de valeur si deux objets situés à des adresses différentes, mais au contenu identique, sont considérés égaux.
Des objets d'une classe à sémantique de valeur sont rarement alloués dynamiquement en tant que tels: Ce sont plus souvent des variables membres d'objets alloués dynamiquement, ou des variables locales.
Les struct du C# ont forcément une sémantique de valeur, ainsi que tous les types valeur de .Net (dont font partie les types dits "primitifs" comme int, float, char...)
À l'inverse, les classes de .Net ou java ont généralement une sémantique d'entité, mais pas toujours: Une règle simple, c'est que si une classe implémente la méthode equals(), alors elle a une sémantique de valeur.