Post by Dominique MICOLLETBonjour,
Post by Jean-Marc BourguetEntre auto et hériter publiquement d'une classe comme vector<> qui n'a
pas été conçue pour, je sais ce que je préfèrerais qu'on enseigne à ceux
qui voudraient devenir mes collègues. ;-)
Rassurez-vous, je n'enseigne pas le C++ :-).
Plus sérieusement, pourriez-vous développer votre réticence quant à
l'héritage public de vector ?
Les cas où c'est sensé sont l'exception plutôt que la règle. En
général, l'héritage public concerne les classes entité (pas copiable,
présence de fonctions virtuelles) et pas les classes valeur (copiable,
absence de fonctions virtuelles). vector est clairement dans la seconde
catégorie.
L'héritage public de classes valeur est généralement un héritage de
convenance, de facilité, pas un héritage qui résulte de critères de
conception. La question de fond est de savoir quelles sont les
invariants que la classe peut bien avoir qu'il n'est pas possible de
mettre à mal en la manipulant comme un vecteur? Si des invariants sont
à risque, l'héritage public est clairement une mauvaise idée. Si aucun
invariant est à risque, on se demande ce que la classe apporte
(complèter une API perçue comme incomplète en ignorant le risque de
faire une classe n'a pas une responsabilité claire est la raison la plus
valable).
L'exemple classique de problèmes introduits par l'héritage public de
classes sans destructeur virtuel est bien sûr la possibilité de faire
classe_de_base* p = new classe_derivee;
delete p;
qui est du comportement indéfini. Il convint mal, les classes valeur
n'étant normalement pas gérées comme ça, l'argument perd en poids ce
qu'il a gagné en étant applicable systématiquement. Quand on connait
les classes, construire des cas plus pertinents est généralement
possible, et quand ce n'est pas le cas, on est dans les cas
exceptionnels où l'héritage est sensé.
Post by Dominique MICOLLETPost by Jean-Marc BourguetCraindre auto me fait penser aux programmeurs C qui craignent les
paramètres références non constantes.
Je n'ai pas compris.
Il y a des programmeurs C qui trouvent qu'en C++
void f(int& p) { ... modifie p ... }
n'est pas assez explicite et donc font
void f(int* p) { ... modifie *p ... }
Eviter auto parce que pas assez explicite me rappelle ces programmeurs.
Etre explicite ou pas est une question interessante, et que certains
tranchent un peu vite, dans les deux sens. Condamner d'office quelque
chose sans l'avoir experimente reellement, parce que pas assez explicite
me semble aussi nuisible que condamner d'office quelque chose parce que
trop explicite (j'en connais habitués à d'autres langages).
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org