Hello
Ca fait longtemps que je n’ai pas review le cours. Il faudra que je le fasse un jour pour la partie POO.
Pour le moment, j’ai quelques remarques, suite a une questions sur le discord NaN.
Dans le code d’exemple https://zestedesavoir.com/contenus/beta/822/la-programmation-en-c-moderne/la-programmation-orientee-objet/classes-a-semantique-dentites/#5-etendre-le-comportement-des-parents, il y a :
En termes d’apprentissage, la répétition est importante. On dit qu’enseigner, c’est répéter encore et encore. Mettre une partie du code et un commentaire pour inciter à aller voir le reste dans une autre partie (ce que les lecteurs ne feront pas), cela fait que le lecteur ne "subit" pas cette répétition.
A mon sens, il vaut mieux mettre systématiquement tout le code. Pour bien qu’il s’imprime dans la tête du lecteur. Pour ne pas qu’il oublie. (Donc ici, la suppression des fonctions de copies dans une sémantique d’entité).
Le risque, c’est d’oublier de mettre le commentaire. Par exemple https://zestedesavoir.com/contenus/beta/822/la-programmation-en-c-moderne/la-programmation-orientee-objet/classes-a-semantique-dentites/#classe-abstraite-et-impl%C3%A9mentation
Au pire, utilisez NonCopiable
si vous ne voulez pas répéter ces lignes a chaque fois.
Toujours pas envie de default init les variables membres ?
Concernant la règles des 0/3/5 : https://zestedesavoir.com/contenus/beta/822/la-programmation-en-c-moderne/la-programmation-orientee-objet/la-semantique-de-mouvement/#4-comme-les-cinq-doigts-de-la-main
Je suis pas fan de la formulation, parce que cela mélange plusieurs choses. Il y a plusieurs "règles" qui influcent l’écriture des opérateurs de copies/move :
- la sémantique d’entité (suppression de la copie)
- les règles de déclaration implicite de ces opérateurs
- la gestion manuelle de la mémoire
La règle des 0/3/5 concerne que le 3ème point. L’idée est que si l’utilisateur a des raisons de définir explicitement une des fonctions concernées par la règle des 0/3/5, alors il y a de forte chances que ces raisons s’appliquent aux autres fonctions.
Dans votre formulation de la régle : "Sinon, le compilateur ne génèrera que celles demandées explicitement et ne fournira pas les autres", cela correspond au second point.
La règle que vous donnez est plus une règle de bonne pratique, pour la lisibilité du code, alors que la règles des 0/3/5 est indispensable pour éviter des bugs.
Dans la discussion sur discord, la personne en arrivait à penser que pour respecter la règle des 0/3/5, il fallait définir les 5 fonctions quand on supprime la copie dans la sémantique d’entité par exemple.
La définition de cppreference est beaucoup mieux https://en.cppreference.com/w/cpp/language/rule_of_three :
If a class requires a user-defined destructor, a user-defined copy constructor, or a user-defined copy assignment operator, it almost certainly requires all three.
"user-defined" ne comprend pas les default
et delete
! Quand on utilise default
et delete
, les fonctions sont "user-declared, implicitly-defined", pas "user-declared, user-defined". Donc la règle des 0/3/5 ne s’applique pas.
A mon sens, c’est important de ne pas mélanger les différentes règles. (La page de cppreference contient les liens vers les règles de bonnes pratiques dans CppCoreGuidelines)