La programmation en C++ moderne

Apprenez la programmation de zéro jusqu'à l'infini !

a marqué ce sujet comme résolu.

Salut à tous,

Voilà, on a fini la partie sur les traits et sur les concepts, je suis en train d’attaquer la partie sur les politiques. Il ne reste que ça, le Javaquarium et on aura fini la partie POO.

Merci d’avance à tous pour vos commentaires.

informaticienzero


Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

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 :

// Les autres fonctions.

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.


int m_epargne;

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)

+1 -0

Salut à tous,

Désolé de l’absence d’activité, on a été très occupé par la finalisation du livre, qui est maintenant disponible ! Merci encore une fois à tous pour vos remarques, vos retours, vos suggestions, qui on fait de ce cours ce qu’il est et de ce projet de livre une réalité ! :)

informaticienzero

Vous avez publié ce tuto en livre ?

Salut,

Je viens pointer un sujet récent où un apprenant ne saisissait pas le concept des itérateurs, pour ceux qui l’ont raté. Ayant relu le chapitre en question et le chapitre précédent, je trouve qu’effectivement, la transition de array/vector vers une généralisation "conteneur" avant les itérateurs est très rapidement dans l’intro en invoquant la std::list. Mais on ne comprends pas pourquoi on a besoin d’autres formes et pourquoi ils n’implémentent pas aussi [], d’où sors cet std::list.
Je laisse les rédacteurs voir ce qu’ils font de ces nouvelles réactions, mais amha : le terme de conteneur a été défini dans le chapitre précédent, il faut y faire un rappel. Et parler rapidement de l’impact des structures de donnée dans les performances ou la sémantique (avec en particulier les conteneurs associatifs qui sont facilement compréhensible) pour expliquer pourquoi on a toutes ces différentes classes qui sont pareilles mais différentes.

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte