École 42
Modules C++
Dix modules C++98, de la forme canonique orthodoxe à l'héritage, aux templates et aux conteneurs STL : 31 exercices au total.
Le contexte
Ces modules couvrent la progression C++ du cursus 42 : iostreams et classes, forme canonique orthodoxe, surcharge d'opérateurs, un type de nombre à virgule fixe, héritage et polymorphisme, classes abstraites et interfaces, templates de fonctions, conteneurs STL, et enfin des exercices plus substantiels comme un convertisseur bitcoin, une calculatrice en notation polonaise inversée et un tri fusion-insertion.
La forme canonique orthodoxe
Le fil rouge des premiers modules est la forme canonique orthodoxe : tout type doit définir explicitement un constructeur par défaut, un constructeur de copie, un opérateur d'affectation et un destructeur, plutôt que de laisser le compilateur en générer des versions par défaut potentiellement incorrectes dès qu'une classe gère une ressource (mémoire allouée, pointeur, fichier). Un réflexe qui structure encore la façon d'écrire une classe en C++ : dès qu'une ressource est possédée, ces quatre fonctions se pensent ensemble.
Héritage, interfaces et templates
Les modules suivants font progresser cette base vers l'héritage et le polymorphisme (classes abstraites, interfaces, destructeurs virtuels), puis vers la programmation générique avec les templates de fonctions et les conteneurs STL. Le point commun entre ces notions, souvent enseignées séparément, est de séparer ce qu'un type fait de comment il le fait : une interface abstraite fixe un contrat, un template le rend indépendant du type concret manipulé.
Trois exercices plus substantiels
Les derniers modules combinent ces notions sur des cas plus complets qu'un simple exercice de syntaxe : un convertisseur de bitcoin qui parse un CSV de cours historiques et le croise avec une base de données, une calculatrice en notation polonaise inversée évaluée avec une pile, et un tri fusion-insertion (l'algorithme de Ford-Johnson) qui minimise le nombre de comparaisons plutôt que le nombre d'opérations. Ce dernier en particulier a demandé de sortir du réflexe « trier avec un algorithme connu » pour comprendre pourquoi regrouper les éléments par paires avant de les insérer par recherche dichotomique réduit le nombre de comparaisons dans le pire cas.
Code bientôt disponible sur GitHub.