La programmation en C++ moderne

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

a marqué ce sujet comme résolu.

Reprise du dernier message de la page précédente

Pour Visual Studio Code, pourquoi pas. C’est light. (Par contre, il est possible d’installer facilement un compilo C++ dans les packages ?) Par contre, Docker ? Je n’ai jamais utilisé pour le C++ mais ça me semble être la grosse artillerie pour débuter.

Et déplacer les tutos que tu vires dans des "Annexes" (+ un disclaimer pour préciser que les tutos sur les IDEs sont souvent moins a jour que les IDEs et qu’il ne faut pas hésiter a demander sur les forums)

Pour poser des questions ou simplement discuter informatique, vous pouvez rejoindre le discord NaN.

+2 -0

En fait, Docker c’est l’environnement, mais le débutant lui n’aura rien de plus à faire que de copier les fichiers de configuration qu’on lui donne, faire « Lancer VS Code dans un conteneur » et hop, Docker c’est fini, on se concentre sur Visual Studio Code et C++. À l’intérieur du conteneur, il a tous les outils qu’il faut, il se promène dans son arborescence avec la ligne de commande, en bref, comme s’il utilisait un vrai Linux.

Bonne idée pour déplacer dans les annexes.

Ça permet de ne présenter qu’un même outil pour tout le monde (donc moins de travail pour nous, puisque pas de répétition sur le débogage, sur la séparation en fichiers, etc), ça permet d’avoir les versions les plus récentes de GCC et Clang (donc pas de disparité de ce côté, tout le monde a les mêmes outils), les outils sont libres, gratuits et présents sur toutes les plateformes majeures. Donc je pense réécrire le tutoriel pour partir dessus.

informaticienzero

Sinon, tu fais comme pour le tuto C : tout en ligne de commande. ^^

+0 -0

Je ne suis pas sur que ce soit un problème pour un cours débutant de ne pas avoir exactement la même version du compilateur. Je trouve que MSVC peut etre utilisé sans problème (installation en 2–3 clics, fonctionnalités supportées suffisantes).

Et pour MinGW, le plus simple est d’installer la version de STL (et ce qui est recommandé sur le forum OC) : https://nuwen.net/mingw.html

Ou installer Qt, qui permet aussi d’installer un IDE et MinGW en 2–3 clics.

Je ne connais pas trop Docker, donc je suis curieux de voir (et tester) vos explications pour l’installer. Mais je trouve en général que ce n’est pas très compliqué d’installer un environnement C++ sur Window. (J’ai l’impression que les problèmes que les gens rencontrent viennent du fait qu’ils suivent un tuto obsolète - que je nommerai pas… - et qu’ils ne lisent pas les tutos à jour qu’on leur donne… et on parie combien que cela risque de continuer avec ceux qui vont suivre votre cours ? ;) )

Édité par gbdivers

Pour poser des questions ou simplement discuter informatique, vous pouvez rejoindre le discord NaN.

+0 -0

Je suis un peu sceptique concernant l’utilisation de "dev container" avec docker pour des débutants:

  • docker sous windows c’est pas vraiment pratique. Ne parlons même pas du cas où la personne est sur Windows Family, ou pire s’il n’a pas les droits admin. Ce dernier cas est presque systématique en entreprise, pour le gars qui veut juste tester vite fait le tuto et voir s’il part dessus ou pas, ce sera un no go direct à mon avis.

  • docker en soit simplifie beaucoup les choses pour utiliser des containers, mais c’est une technologie très complexe sous le capot, donc pour la majorité des utilisateurs c’est une bonne grosse boite noire. Un débutant se pose souvent 40000 questions sur les outils qu’il utilise, ajouter une couche de boite noire n’arrangera pas les choses, surtout qu’en soit elle n’a rien à voir avec le C++. N’aura t’il pas déjà bien assez à apprendre avec le langage, le compilateur et l’IDE utilisé?

+3 -0

Merci pour vos retours. De toute façon, rien n’est encore acté, ça ne se fera pas avant la sortie de WSL2.

Néanmoins, les arguments que tu cites @Pataques peuvent aussi valoir dans l’autre sens. Si le mec est en entreprise et a le poste sans droit d’admin, il ne pourra pas plus installer Visual Studio ou Qt Creator.

Quant aux boîtes noires, on se repose sur elles tout le temps. Le processus de compilation est pour un débutant une boîte noire. L’IDE aussi. Même quand on voit l’allocation dynamique, c’est une boîte noire qui nous réserve une portion de mémoire, sans qu’on sache ce qui est fait vraiment.

Il y a tellement d’abstractions qu’on ne peut pas tout dévoiler, tout expliquer. Et puis il suffit d’expliquer que Docker permettra d’avoir le même environnement pour tout le monde et cela conviendra pour la plupart des lecteurs. Ceux qui veulent aller plus loin le feront seuls, car de toute façon un cours ne peut pas tout aborder.

Avant de prendre une décision, je vais attendre déjà la sortie de WSL2 et de Docker for Windows utilisant WSL2. Si tout fonctionne comme ils le prévoit, vu qu’on aura un vrai Linux sous le capot, même Windows Familial marchera. :)

Si le mec est en entreprise et a le poste sans droit d’admin, il ne pourra pas plus installer Visual Studio ou Qt Creator.

Alors que vim et cygwin (via mobaxterm, le plus simple aujourd’hui), pas besoin d’être admin :D

Ceci dit, QtCreator s’installe (depuis les sources) sans être admin (sous linux du moins, pour Windows, je ne sais pas)

L’idée d’un docker n’est pas forcément déconnante. Au boulot, c’est des VM (de 20+ gigas) que je distribue. Et justement, la dernière fois ils ont tous utilisé QtCreator (je n’impose rien), et j’ai été bluffé par la dernière version qui comprend LSP visiblement. J’ai trouvé que c’était pas mal car ça permet de les aider à corriger les erreurs avant même de lancer la compilation. J’ai trouvé le processus moins psychologiquement violent.

Édité par lmghs

+0 -0

Une petite relecture, en espérant ne pas radoter.

§ OO/ penser en termes de services

avec tel algorithme appliqué à tel structure ou tel type

"structure" est féminin -> telle


§ un chouilla plus loin: le pressing

Dans ce cas, toute la complexité de tri par couleur, de bonne quantité de lessive et autres est cachée

"cachée" a tendance à être un faux ami côté conception. Je préférerai presque "déléguée". Mais cela a aussi un sens fort :(. Quid "confiée à un spécialiste" ?

Autre reformulation qui me vient à la volée: "On n’a pas besoin de maîtriser les arcanes du nettoyage, des gens/spécialistes en qui on peut avoir confiance vont en assumer la responsabilité."

A ce propos, le terme a été employé mais pas posé: tout cela n’est jamais que de l’abstraction, et c’est une pierre fondamentale (je ne sais plus parler français) de la conception OO.


§ OO/exemple concret

j’ai fais remarquer

-> effe-a-i-té, pas esse ;)

Mais… ce n’est pas une écriture à 4 mains?


§ OO/un peu de vocabulaire

Un objet n’est ni plus ni moins qu’une valeur qu’on manipule

une donnée, plutôt qu’une valeur, non?


§ OO/le type

Justement, comment sont définis les services qu’un objet peut rendre ?

Ne faudrait-il pas préciser que c’est le cas du C++ et d’autres langages à typage statique (?) ? Et que ce n’est pas vrai dans certains, plus proches de la définition OO originelle, où à la place on demande à un objet de répondre à un message, et que peut-être on ne sait pas s’il en est capable avant d’essayer.

on pourra créer autant d’objet

accorder au pluriel "objets"


§ OO/donc en C++

définir des fonctions à l’intérieure d’une structure

pas de "e" final à "intérieur"


§ OO/quelle méthode doit-on employer

Le prototype n’a rien d’extraordinaire, mais l’implémentation

Hum… j’aurai plutôt parlé de "déclaration", et de "définition". Je n’ai pas la norme sous les yeux pour voir quels sont les termes officiels.

la fonction à laquelle il a affaire

-> "à faire", IIRC


§ OO/séparons tout ça

séparer notre code entre définition et implémentation

Tu veux dire "définition de la classe" et "définition des fonctions" :)

vous-mêmes

Pas sûr qu’il faille un 's’ à "même" ici

découpez et vous gagnerez en lisibilité .

Avec le folding supporté par tous les outils modernes, est-ce que cela est toujours vrai? L’intérêt est lié à la chaine de compilation&link, et éventuellement à des considérations de distribution de code source.


§OO/invariant

Imaginez notre blanchisserie. Son invariant est que votre linge soit toujours en bon état

Je dirai plus qu’il s’agit d’une post-condition.

Pour info, mon exemple d’invariant est le suivant (en plus il se transpose bien à l’héritage et aux membres protégés: "peut-on avoir plus confiance aux enfants qu’aux voisins?"):

Mon chat est un drogué: il se fait des lignes de savon de Marseille. Je suis donc obligé de laisser la porte de la buanderie fermée en permanence.

Le voisin a un pb avec sa machine et vient toquer à la porte pour laver son linge. Pas de soucis, je lui file un double des clés et lui fais part de mon invariant/TOC: la porte de la buanderie doit toujours restée fermée.

Premier jour, il vient, et lave ses couleurs, il pense à bien refermer la porte à chaque fois. Nickel!

Deuxième jour, il revient pour son linge foncé. En court de route, appel de l’école: il y a une urgence et doit filer récupérer son gamin. Situation totalement exceptionnelle qui le fait partir précipitamment sans penser à refermer la porte de la buanderie.

Mauvaise surprise au retour, le chat est intoxiqué et je dois aller au véto.

-> discussions sur la confiance, les invariants, pourquoi on protège, etc.


même §

cours-jus

-> court-jus


§ privé VS public

inutile de le laisser masquer

-> laissé

Après: je dirai que par soucis d’homogénéité, c’est mieux d’éviter de trop mélanger les attributs publics et privés dans une même classe. -> principe de la moindre surprise.


§ Qui va construire

De même, l’initialisation ne se fait pas dans le corps du constructeur

Je rajouterai bien un "exclusivement". Car on peut le faire, mais ce n’est pas toujours le mieux, etc., etc.


même §

J’aurai bien appelé la fonction de réduction dans le constructeur. Ce n’est n’est alors qu’un renforcement technique de l’invariant.


§ 1 ctr, des ctrs

une seul ligne

-> seule*


std::string const d { iterateur, fin };

Je n’aime pas l’unicorn syntax pour les types conteneurs. Je préfère la réserver aux séquences de valeurs à stocker.


§ mutable

Une fonction membre constante, c’est une fonction qui ne modifie pas l’objet auquel elle appartient.

-> une fonction qui promet. Ce n’est pas parce que l’on ne modifie pas (chose que le compilateur sait observer), que nous (développeurs) le faisons promettre dans le code.

dans le cas de std::vector, la fonction membre front

Je préférerai parler dans un premier temps de size ou de empty car il n’existe pas de surcharge non-const, et que quelqu’un de curieux pourrait voir qu’il y a plusieurs versions de front.


Je relirai attentivement la page sur la sémantique de valeur plus tard

+1 -0

Sémantique de Valeur

Intro

J’aime bien l’exemple du compte en banque. J’imagine qu’il est réutilisé plus tard pour dire que des comptes peuvent êtres différents mais disposer de la même somme.

ordre

On peut aussi définir

-> "on peut aussi parfois définir": car toutes les valeurs ne sont pas ordonnables, et on pourrait mal généraliser la phrase.

§ Copier

On peut créer autant d’instances du même objet

La phrase est bizarre si on prend le vocabulaire précédent qu’une instance (d’une classe) est un objet. Dans l’immédiat, je n’ai pas de bonne tournures: "autant de duplicatas d’un même objet"?

autre instance de l’objet

-> une autre instance de la classe

affectation

affecter une copie d’un autre objet à notre instance après coup

J’aurai plutôt dit:

-> affecter une nouvelle valeur à notre instance en dupliquant (/par duplication de?) celle d’un autre objet

Chainage des affectations

Peut-être préciser: "mais pourquoi veut-on faire ça?" que c’est pour garder une compatibilité/similitude de comportement avec le C, et suivre le principe de la moindre surprise. C’est facile et rapide à faire, donc on le fait systématiquement.

Des curieux pourraient se demander pourquoi un retour par référence. Je ne suis pas sûr qu’il faille montrer les horreurs que cela permettait et que l’on garde pour rester 100% compatibles toujours. Parler d’optim peut-être seulement? Et encore…

[nv]ous-mêmes

-> pas de "s" à "même": les explications ici: http://www.lefigaro.fr/langue-francaise/expressions-francaises/2017/09/24/37003–20170924ARTFIG00002-nous-memes-ne-faites-plus-la-faute.php

Je soupçonne que c’est un peu partout dans le cours.

"Les opérateurs d’affectation intégrés"

C’est pas "composés" qu’on dit? (pour coumnpound)

Opérateur +

Puisque le paramètre a est une copie

C’est plus subtil. Beaucoup plus subtil. Mais vous le savez déjà.

Amitié

Ici elle n’est pas nécessaire pour op+. Mais elle a un avantage très avancé (en terme de prérequis pédagogiques) relativement à la résolution de noms.

Libre, membre

J’ai peur qu’il faille creuser la question. En TP (sur la matrice), je vois systématiquement des problèmes avec des gens qui vont définir T op+(T, T) dans la définition de la classe. Il y a souvent deux soucis: le premier est qu’ils ne savent jamais où placer la définition même si deux planches avant je montre comment faire. Le second (bien moins important) est qu’ils n’aiment pas les références constantes.

Du coup je me retrouve à chaque fois à expliquer :

  • que T1::op¤(T2) <~> op¤(T1&, T2),
  • car quand le compilateur voit a ¤ b, il cherche dans l’ordre type(a)::op¤(type(b)), puis op¤(type(a), type(b))
  • et que T1::op¤(T2, T3) <~> op¤(T1&, T2, T3) et qu’il n’y a pas d’opérateur ternaire surchargeable et qu’en particulier + ne l’est pas (ternaire).
  • et que c’est comme ça par choix syntaxique

Et même avec ça, je sens que je galère à bien faire comprendre à chaque fois. Du coup, je suis intéressé par tout RETEX d’enseignement cours/TP sur ces sujets.

Je sens qu’il y a une subtilité pour que ça passe bien et sans accrocs, et que je ne l’ai pas encore.

objets fonction

ce § peut être sorti de la sémantique de valeur je pense.

+1 -0

Salut à tous,

Ces derniers temps, l’écriture a ralenti, mais on compte bien reprendre. Au programme, les deux premiers chapitres de la partie POO sont presque terminés. Notez l’apparition d’une nouvelle section dans le premier chapitre, qui parlera notamment du S de SOLID, ainsi que de la loi de Déméter.

De son côté, @mehdidou99 avance petit à petit sur l’étude de cas.

Je pense qu’on enverra la partie POO quand les quatres premiers chapitres seront terminés, ce qui permettra de disposer déjà de la sémantique de valeur. On verra, en fonction de l’avancement, si on publie l’étude de cas en même temps ou après.


Bonjour les agrumes !

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

Merci d’avance pour vos commentaires.

Édité par informaticienzero

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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