OVH Cloud OVH Cloud

Trois strates dans C++ ?

76 réponses
Avatar
Marc Boyer
Bonjour à tous,

risquant d'avoir à faire un cours de C++, je réflechissais
un peu à la présentation générale, à la hiérarchisation des
connaissances en C++.

Je vois actuellement 3 strates dans C++:

I. "C++ as a better C"

C++ comme un langage impératif procédural, sans objet
utilisateur (ie presque que des POD), une sorte de C
augmenté par les E/S iostream, iofstream, les conteneurs
STL (vector, list..), string, les itérateurs et les algos
(find, remove...)
Et puis surtout les références et const.
Eventuellement la surcharge des opérateurs.

II. C++ comme un Java-like

Introduction des objets, methodes, encapsulation
(public/private).
Vie de l'objet: constructeur/destructeur, opérateur
de copie, constructeur de copie, tous public.

Héritage public / polymorphisme dynamique: virtual...

III. C++ comme support à la conception

Tout ce qui permet à C++ de gérer des patterns
particuliers: les opérateurs de vie de l'objet privé,
l'héritage privé.

Et puis il y a aussi l'écriture de ses propres classes
templates, qui me semble possible sérieusement qu'après
avoir intégré le II, que je mets donc là même si c'est
peut-être orthogonal.


Cette réflexion me semble importante car C++ est
souvent rejetté de par sa complexité. Et c'est vrai
qu'il me semble que beaucoup de l'agitation autour de
C++ se fait dans le III, que c'est peut-être la partie
intellectuellement la plus exitante, mais qu'elle ne
peut qu'effrayer la majorité des débutants.

Voilà, dans mon cours, je viserais plutôt I et II.

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain

10 réponses

Avatar
Fabien LE LEZ
On Thu, 23 Feb 2006 16:11:11 +0000 (UTC), Marc Boyer
:

Bon, après, la gestion des erreurs dans le format d'entrée,
je pense que c'est pénible dans les deux langages.



[...]

En C, un coup de fgets + scanf


sscanf

En C++, faut tester l'état du flux à chaque fois, non ?


J'avoue que je ne sais pas. Si je dois lire un istream, j'utilise
uniquement getline(), puis je parse à la main. Parfois avec sscanf,
d'ailleurs.



Avatar
Marc Boyer
Le 23-02-2006, Fabien LE LEZ a écrit :
On Thu, 23 Feb 2006 16:11:11 +0000 (UTC), Marc Boyer
:

Bon, après, la gestion des erreurs dans le format d'entrée,
je pense que c'est pénible dans les deux langages.



[...]

En C, un coup de fgets + scanf


sscanf


Oui, mon clavier à fourché.
Heureusement, le compilo détecte en général quand
je fais ce genre d'erreur.

En C++, faut tester l'état du flux à chaque fois, non ?


J'avoue que je ne sais pas. Si je dois lire un istream, j'utilise
uniquement getline(), puis je parse à la main. Parfois avec sscanf,
d'ailleurs.


Le couteau suisse, ça a du bon parfois ;-)

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exiter des sots
IF -- Rudyard Kipling




Avatar
Laurent Deniau
Fabien LE LEZ wrote:
On Thu, 23 Feb 2006 10:56:44 +0100, Laurent Deniau
:


techinquement les templates sont plus compliques que le polymorphisme
d'heritage



Tiens ? J'aimerais bien que tu m'expliques ça. J'ai toujours trouvé
que c'était le contraire.


D'abord BS dit lui-meme dans le D&E que l'implementation des templates
lui a pose plus de probleme que l'heritage multiple ou le polymorphisme
d'heritage, contrairement a ce que la communaute C++ pensait a cette
epoque. Et je le crois sur parole.

Ensuite, tout ce qui est lookup est souvent complique par nature, du
moins plus qu'un simple ajustement d'offset et un appel indirect. Ce qui
peut rendre complique le polymorphisme d'heritage en presence d'heritage
multiple (avec l'heritage simple c'est trivial), c'est les optimisations
aggressives des compilateurs pour obtenir le meilleur compromis
rapidite-du-code/taille-des-instances.

Si tu prends le lookup avec l'overloading, les namespaces, les classes
(derived, nested, local), l'accessibilite, les fonctions, les
operateurs, les fonctions membres, les usings, les friends, l'operateur
de resolution, les declarations, les definitions, les conversions
(implicite, user-defined), les promotions, les traits, c'est deja
passablement complique (du moins pour ma petite tete). Rajoute la dessus
l'impact des templates et leurs specialisations pour chaque combinaison
de ces points et je pense que ca devient ce que j'appelerais complique.
Je pense que ceux qui ecrivent les routines de lookup, meme si elle sont
clairement definie dans la norme, ne participent pas a la partie la plus
facile de l'implementation du langage.

Reste aussi a considerer les concepts-check qui essaye de verifier que
tout ce que tu as ecrit et la facon dont tu l'utilises tiens debout et
correspond a ce qui a ete prevu.

a+, ld.


Avatar
Franck Branjonneau
Marc Boyer écrivait:

Le 23-02-2006, Fabien LE LEZ a écrit :
On Thu, 23 Feb 2006 15:56:36 +0000 (UTC), Marc Boyer
:

Bon, après, la gestion des erreurs dans le format d'entrée,
je pense que c'est pénible dans les deux langages.


Pour le coup, j'en viens à me demander si c'est pas pire en C++.


Je me demande. Je suis pas expert.
En C, un coup de fgets + scanf, et scanf disant combien
de conversions il a réussit à faire, je vois à peut prêt
comment faire.
En C++, faut tester l'état du flux à chaque fois, non ?


Autant de fois que tu testes le retour de fgets en C.
À chaque fois ? ;-)

--
Franck



Avatar
Fabien LE LEZ
On Thu, 23 Feb 2006 18:38:01 +0100, Franck Branjonneau
:

Autant de fois que tu testes le retour de fgets en C.


Mauvais exemple AMHA. Typiquement, fgets() et getline() s'utilisent en
boucle, et le code de retour est testé pour arrêter la boucle.

Celui qui devrait être testé systématiquement et ne l'est pas, c'est
(s)scanf.

Avatar
Fabien LE LEZ
On Thu, 23 Feb 2006 17:56:24 +0100, Laurent Deniau
:

techinquement les templates sont plus compliques que le polymorphisme
d'heritage


Tiens ? J'aimerais bien que tu m'expliques ça. J'ai toujours trouvé
que c'était le contraire.


D'abord BS dit lui-meme dans le D&E que l'implementation des templates [...]


Ah, OK, tu parles de l'implémentation. Je m'intéressais quant à moi à
l'accès d'un débutant à une fonctionnalité.

Une interface GUI (notamment pour un OS) est plus facile à utiliser
qu'une interface "console" pour un débutant, bien qu'elle soit plus
compliquée à implémenter.



Avatar
Jean-Marc Desperrier
Marc Boyer wrote:
Va falloir que j'apprenne l'électronique. Heuh, dans l'idéal,
se serait bien. Mais je sais pas si je vais avoir le temps.
Tu peux t'inspirer de ce qui existe.



J'ai de vagues souvenirs de terminale (ou prépa ?). Tout circuit
ayant une capacité et une résistance équivalente... Faut voir.


Arf !! Ca me fait réagir ça.

Je ne sais pas si vous savez que la traduction française du Stroutrup a
une erreur de traduction grandiose reliée exactement à cela :-) (en tout
cas l'édition d'il y a quelques années, ça a peut-être été corrigé dans
une réédition).

Il y a un petit exemple qui traîne au début du bouquin qui calcule
l'amortissement d'un circuit capacité/résistance.

Sauf que le traducteur français qui visiblement n'a jamais touché à
l'électronique :-) a séché sur "damping" (amortissement), et plutôt que
d'ouvrir son Harrap est parti dans l'exotique en parlant de calculer la
valeur de l'"humidité" du circuit. Ca devrait beaucoup faire rire tes
élèves.



Avatar
Franck Branjonneau
Fabien LE LEZ écrivait:

On Thu, 23 Feb 2006 18:38:01 +0100, Franck Branjonneau
:

Autant de fois que tu testes le retour de fgets en C.


Mauvais exemple AMHA. Typiquement, fgets() et getline() s'utilisent en
boucle, et le code de retour est testé pour arrêter la boucle.


Comprends pas. En C++ tu fais un test par getline, en C un test par
fgets -- ça en fait autant non ?

--
Franck Branjonneau


Avatar
Loïc Joly
On Wed, 22 Feb 2006 19:29:20 +0000 (UTC), Marc Boyer
:


C'est donc un cours fait pour des programmeurs C ?


C'était tellement implicite que je n'ai pas eut à le dire ;-)



Si les élèves connaissent déjà le C, on peut passer rapidement sur les
trucs de base (notion de variable, de fonction)


Bof, j'ai du faire récemment un cours de C++ à des gens connaissant le
C, je me suis basé dessus, et en pratique, ils ne le connaissaient pas
vraiment...

--
Loïc



Avatar
Loïc Joly


Ah, OK, tu parles de l'implémentation. Je m'intéressais quant à moi à
l'accès d'un débutant à une fonctionnalité.

Une interface GUI (notamment pour un OS) est plus facile à utiliser
qu'une interface "console" pour un débutant, bien qu'elle soit plus
compliquée à implémenter.


"Bien que" ou "c'est pourquoi" ?

A mon avis, la même analogie tient en mettant les termes C et C++.

--
Loïc