Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les news > Tutos > Nouveau TP C++ : création de la classe ZString > Lecture d'une news

Commentaires de news :
Nouveau TP C++ : création de la classe ZString

Revenir à liste des news

Nouveau TP C++ : création de la classe ZString

# Par M@teo21, le 25/03/2008 16:06:31
Bien que la partie I du cours de C++ soit officiellement "terminée", un certain nombre d'entre vous n'ont pas manqué de remarquer qu'elle manquait cruellement d'un TP.

En effet, les concepts de la programmation orientée objet enseignés dans cette partie sont riches, et je suis convaincu que sans un TP on ne peut pas se rendre compte si on a vraiment compris ou pas.
Certes, la partie II sur Qt sert en quelque sorte de gigantesque TP, mais ce sera au final une partie assez simple et il me paraissait nécessaire d'introduire un TP avant la fin de la partie I.

Il m'a fallu un certain temps pour rassembler suffisamment de courage pour l'écrire. En effet, je savais d'avance qu'il s'agirait d'un des plus gros TP que j'aurai à écrire. Un des plus difficiles aussi, sans aucun doute.

Image utilisateur
10) TP : La POO en pratique avec ZString

Ce TP vient s'insérer juste après la surcharge d'opérateurs et avant l'héritage. Il n'y est donc pas question d'héritage.
Il fait écho au chapitre 5 qui montrait comment utiliser la classe string de la bibliothèque standard du C++. Ce que ce chapitre propose, c'est ni plus ni moins que de recréer cette classe (avec un peu moins de fonctionnalités bien sûr :p ). Le nom de ZString , pour Zéro-String, a été choisi.

C'est un chapitre difficile, mais je suis convaincu que c'est un excellent exercice pour vous faire comprendre les mécanismes de la POO. Vous devez en particulier être au point avec la gestion des chaînes de caractères. Je vous invite dès le début à relire le chapitre sur les chaînes (issu du cours de C) pour ceux qui auraient oublié.




Bon courage, c'est assez long et ça demande sans aucun doute plus de réflexion qu'un chapitre "classique".
Moi-même j'en ai bavé pour l'écrire, c'est vous dire :p

53 Commentaires

Désolé, les commentaires de cette news sont désactivés, vous ne pouvez pas en ajouter !

Page : Précédente  1  2 
Pseudo Commentaire
1 visiteur sur cette news (0 membre et 1 anonyme)
Page : Précédente  1  2 
Hors ligne SpyBen # Posté le 26/03/2008 12:48:28
Noob Spotted !!
Avatar
Groupe : Membres
C'est cool! Par contre va falloir que je m'y mette (fainéant :-° )

Image utilisateur
 
Hors ligne KWAL01 # Posté le 26/03/2008 13:42:18
Maitre KAY pour vous servir ;)
Avatar
Groupe : Membres
je plussoi le chapitre prochain sur linux :p
sinon ca va saigner :pirate:

non je rigole. en tout cas j'applaudis la regularite des news et des cours/tp
sans parler de leur diversité
Hors ligne [R] # Posté le 26/03/2008 17:00:16
Groupe : Membres
Bonjour,

C'est pas mal, mais il y a quand même quelques détails un peu ennuyeux.

Déjà ça :
Citation : mateo21

La classe "string" de la bibliothèque standard est un mauvais exemple à ne pas suivre :p


Même avec le smile, ça choque un peu. ;)

Le mieux à mon sens aurait été d'utiliser un espace de nom. string existe déjà, mais pas SDZ::string.

Je remarque également que beaucoup de tes int sont en fait des unsigned int.

Des fonctions qui sont conceptuellement const ne le sont pas dans ton code. Même si tu le précises en conclusion, je ne pense pas que ce soit une bonne idée de laisser un code pas aussi propre qu'il pourrait être.
Ex : ZString longueur(const char *chaine);

Cette méthode n'est pas à sa place. Déjà, elle devrait être remplacée par cstring::strlen. Ensuite, elle devrait être privée SI elle n'a d'utilité que pour la classe elle-même.
Mais il faut que cette classe chaine dispose d'une méthode qui donne sa taille. Il faut donc une fonction ZString::longueur() const; (sans paramètre donc). Un accesseur en lecture est à 99 % du temps const.
Et d'ailleurs, les get... c'est plutôt l'usage en java, en c++ c'est plus souvent ...() (je préfère perso, c'est moins lourds et tout aussi parlant).

ZString::copie devrait être privé. Le constructeur par recopie est là pour ce genre de problématique.

ZString::afficher ne devrait pas être présent. Ca lie inutilement ZString à iostream.
Il n'est pas plus long d'écrire :
ZString str = "abc";
std::cout << str.getChaine();
Que :
ZString str = "abc";
str.afficher();
De plus, comment fais-tu pour écrire sur std::cerr ? Tu ne peux pas passer par ZString::afficher.

En règle générale d'ailleurs, tu devrais à mon avis éviter les using namespace std;. Ca encombre l'espace de nom global.
Et gagner 5 caractères en remplaçant std::cout par cout n'a pas un intérêt suffisant pour encombrer l'espace de nom global.

En résumé, il y a beaucoup à dire sur ce code. Je ne suis pas certain que tu es choisi un bon sujet de TP : même si ça n'en a pas l'air, écrire une classe chaine est beaucoup plus compliqué qu'il n'y parait de primer abord.

Je serais content de te lire si tu réponds à ce post. J'ai écrit ça rapidement, certaines choses sont peut-être discutables.
Hors ligne M@teo21 # Posté le 26/03/2008 17:41:18
Doh ! Nuts. Mmh, donuts !
Avatar
Admins
Je suis parfaitement conscient de ces petites imperfections et je les assume pleinement. Je m'attendais à des réponses de ce genre, car le sujet est complexe et obtenir un truc "parfait" aux yeux de tous relève de la mission impossible.

Néanmoins, je pense avoir mené à bien une mission d'ordre pédagogique en écrivant ce tuto. Tu n'as fait en général que relever des erreurs (qui n'en sont pas, c'est juste que ça fait pas trop "best practices" je te l'accorde) qui sont induites par la méthode pédagogique. Il y a par exemple le fait de ne pas avoir mis de méthode constante. Je ne pouvais faire autrement n'ayant pas expliqué ce concept auparavant, mais je rectifie le tir en conclusion en expliquant qu'il faudra améliorer ça.
Quant à la méthode afficher, elle n'a pas de sens non plus, sauf que pour mon tuto j'ai besoin d'une méthode d'affichage avant de surcharger le <<. Toi tu ne vois pas le problème de la même manière, tu te dis "il est con, pourquoi il a pas surchargé << de suite ?". Moi je le vois d'une toute autre manière : je conçois l'écriture de manière linéaire de telle sorte que je puisse expliquer au mieux le processus de réflexion qui me permet d'écrire une telle classe.

En revanche, j'avais laissé une erreur (le delete[]), cela a été corrigé immédiatement dès que ça m'a été signalé.
Je ne prétends pas écrire la classe parfaite pour la gestion des string. C'était pas mon but. J'espère au moins avoir aidé grâce à ce TP beaucoup de gens pour qu'ils comprennent le processus de création d'une classe, le concept "les attributs sont propres à l'objet", etc etc.

Techniquement, je suis complètement d'accord avec toutes tes remarques. Je me les étais déjà faites dans ma tête. Pédagogiquement je ne peux pas tout faire et je suis obligé de faire ces compromis.
Tu trouveras plus d'informations sur ma façon de concevoir les tutoriels sur cette page :
http://www.siteduzero.com/savoirplus.html#tutoriels

<tuto etat="redaction" mode="venere" target="c++" />

Ce qui se conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément.

Nicolas Boileau (je suis fan)
Autobiographe à ses heures perdues :p
 
Hors ligne GoD++ # Posté le 26/03/2008 17:44:32
Groupe : Membres
Bonjour,

Bon tuto, mais j'ai quand même une petite remarque à faire en ce qui concerne la surcharge de l'opérateur + (et même de == ou != ). çà n'aurait pas été plus intéressant, au lieu de faire un simple copier-coller, de faire :

Code : C++ - Afficher / masquer les numéros de ligne
  1. ZString ZString::operator+(const ZString &chaine)
  2. {
  3.      return operator+(chaine.m_chaine); //on appelle la méthode ZString::operator+(const char* chaine)
  4. }


Qu'en pensez-vous?
Hors ligne total chaos # Posté le 26/03/2008 17:47:21
le C++, j'en mange!
Avatar
Groupe : Bannis
Citation : GoD++
Bonjour,

Bon tuto, mais j'ai quand même une petite remarque à faire en ce qui concerne la surcharge de l'opérateur + (et même de == ou != ). çà n'aurait pas été plus intéressant, au lieu de faire un simple copier-coller, de faire :

Code : C++ - Afficher / masquer les numéros de ligne
  1. ZString ZString::operator+(const ZString &chaine)
  2. {
  3.      return operator+(chaine.m_chaine); //on appelle la méthode ZString::operator+(const char* chaine)
  4. }


Qu'en pensez-vous?
ça s'appelle du vol, ce que tu viens de faire! j'ai signalé ça avant toi: http://www.siteduzero.com/tuto-50-28807.html ( c'est peut etre le hasard!)
 
Hors ligne TheDead Master # Posté le 26/03/2008 18:22:24
4 8 15 16 23 42
Avatar
Groupe : Membres
Citation : total chaos
ça s'appelle du vol, ce que tu viens de faire! j'ai signalé ça avant toi


Faut pas abuser non plus, c'est pas parce qu'il a eu la même idée que toi qu'il t'as forcément "volé" ton post. Surtout que c'est même pas la même fonction :\
 
Hors ligne GoD++ # Posté le 26/03/2008 18:23:14
Groupe : Membres
sorry! pas fait exprès! :-°
Hors ligne [R] # Posté le 26/03/2008 18:34:47
Groupe : Membres
Citation : M@teo21
Je suis parfaitement conscient de ces petites imperfections et je les assume pleinement. Je m'attendais à des réponses de ce genre, car le sujet est complexe et obtenir un truc "parfait" aux yeux de tous relève de la mission impossible.


Je m'attendais également à une réponse de ce genre. ;)

Citation

Néanmoins, je pense avoir mené à bien une mission d'ordre pédagogique en écrivant ce tuto. [...] je conçois l'écriture de manière linéaire de telle sorte que je puisse expliquer au mieux le processus de réflexion qui me permet d'écrire une telle classe.


Il est vrai que l'aspect pédagogique (et le public visé) rende l'exercice très difficile, pour ne pas dire impossible.

Citation
Je ne prétends pas écrire la classe parfaite pour la gestion des string. C'était pas mon but. J'espère au moins avoir aidé grâce à ce TP beaucoup de gens pour qu'ils comprennent le processus de création d'une classe, le concept "les attributs sont propres à l'objet", etc etc.


Je n'avais pas vu le problème via cet angle. Ta démarche est effectivement cohérente.

Citation

Techniquement, je suis complètement d'accord avec toutes tes remarques. Je me les étais déjà faites dans ma tête. Pédagogiquement je ne peux pas tout faire et je suis obligé de faire ces compromis.


Il y a juste un "détail" que tu pourrais corriger tout en restant pédagogique : using namespace std. cout tout seul, ce n'est pas une bonne pratique selon moi. Et expliquer le pourquoi du comment de manière pédagogique et accessible, moi je n'en serai pas capable, mais toi si.

Les méthodes qui sont publiques alors qu'elle devrait être privées, tu pourrais améliorer ceci, non ?
Hors ligne M@teo21 # Posté le 26/03/2008 18:51:08
Doh ! Nuts. Mmh, donuts !
Avatar
Admins
Pour ces points là c'est effectivement améliorable, j'essaierai de m'en occuper en fin de semaine si j'ai le temps :)
Pour les méthodes privées, je le signalerai probablement à la fin pour ne pas surcharger mes explications dans le fil du tuto.

<tuto etat="redaction" mode="venere" target="c++" />

Ce qui se conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément.

Nicolas Boileau (je suis fan)
Autobiographe à ses heures perdues :p
 
Hors ligne total chaos # Posté le 26/03/2008 18:54:15
le C++, j'en mange!
Avatar
Groupe : Bannis
Citation : GoD++
sorry! pas fait exprès! :-°
pas grave, j'ai pas dit ça dot le but de t'offenser. hein?;
 
Hors ligne total chaos # Posté le 26/03/2008 18:54:54
le C++, j'en mange!
Avatar
Groupe : Bannis
autre truc amliorable: aulieu de faire deux constructeur comme ça:
Code : C++ - Afficher / masquer les numéros de ligne
  1. ZString(); // Constructeur par défaut (crée une chaîne vide "")
  2.  
  3.  ZString(const char *chaine); // Constructeur surchargé (crée la chaîne envoyée)


tu peux faire comme ça :
Code : C++ - Afficher / masquer les numéros de ligne
  1. ZString(const char *chaine = 0);

afin de revoir les param facultatifs!
 
Hors ligne Mackila # Posté le 26/03/2008 19:26:48
Gorille bourré
Avatar
Modérateurs
Citation
D'autre part, on bénéficie des outils puissants du C++ comme la surcharge des opérateurs. Cela nous permet d'écrire des choses intuitives comme :

Code : C++ - Afficher / masquer les numéros de ligne
  1. string nom = "Mateo";
  2. string maChaine = "Bonjour " + nom; // Vaudra "Bonjour Mateo"


Non. Tu n'écriras jamais string maChaine = "Bonjour " + nom; en C++. Ne pas écrire des choses dans les règles de l'art pour simplifier la compréhension pour le lecteur, OK, écrire des choses fausse, c'est moins bien :P

Image utilisateur
 
Hors ligne DHKold # Posté le 26/03/2008 23:54:03
Ex-Admin
Avatar
Groupe : Membres
Sauf s'il surcharge l'operator+ global :-°

Edit: /

Une erreur avec votre code? Déboguez avec GDB!
----------
Pack DHemoticons (Utilisation Libre)
Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur
 
Hors ligne M@teo21 # Posté le 26/03/2008 23:57:12
Doh ! Nuts. Mmh, donuts !
Avatar
Admins
Citation : Mackila
Citation
D'autre part, on bénéficie des outils puissants du C++ comme la surcharge des opérateurs. Cela nous permet d'écrire des choses intuitives comme :

Code : C++ - Afficher / masquer les numéros de ligne
  1. string nom = "Mateo";
  2. string maChaine = "Bonjour " + nom; // Vaudra "Bonjour Mateo"


Non. Tu n'écriras jamais string maChaine = "Bonjour " + nom; en C++. Ne pas écrire des choses dans les règles de l'art pour simplifier la compréhension pour le lecteur, OK, écrire des choses fausse, c'est moins bien :P


Ooops, personne ne l'avait vue celle-là non plus.
C'est vicieux faut dire :p

Merci je corrige dans la minute.

<tuto etat="redaction" mode="venere" target="c++" />

Ce qui se conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément.

Nicolas Boileau (je suis fan)
Autobiographe à ses heures perdues :p
 
Hors ligne DHKold # Posté le 27/03/2008 00:00:27
Ex-Admin
Avatar
Groupe : Membres
Je suppose que tu as vu mon commentaire concernant l'auto-affectation. Etant donné que c'est quelque chose qui revient quasiment tout le temps dans la création de classe, ne serait-il pas intéressant de le signaler, si pas directement dans le TP, en commentaire à la fin? Ca peut vraiment pourrir la vie ce genre de chose ^^

Une erreur avec votre code? Déboguez avec GDB!
----------
Pack DHemoticons (Utilisation Libre)
Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur
 
Hors ligne M@teo21 # Posté le 27/03/2008 00:01:41
Doh ! Nuts. Mmh, donuts !
Avatar
Admins
Euh non j'ai dû zapper je vais lire. Je pense que ça peut se mentionner sans problème vers la conclusion, par contre en milieu de tuto si c'est un détail un peu délicat je préfèrerai éviter.

<tuto etat="redaction" mode="venere" target="c++" />

Ce qui se conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément.

Nicolas Boileau (je suis fan)
Autobiographe à ses heures perdues :p
 
Hors ligne jarod01 # Posté le 27/03/2008 19:39:39
Groupe : Membres
un tres bon tp, bravo pour ce choix
Hors ligne Layus # Posté le 30/03/2008 12:45:29
!? encore un Layus...
Groupe : Membres
Coucou,
Un message un peu en retard...
(il faut m'excuser, j'étais en vacances)

Je suis fort étonné que le constructeur de copie fasse appel à la méthode "longueur()" dans ce code :

Citation :
Code : C++ - Afficher / masquer les numéros de ligne
  1. ZString::ZString(const ZString &chaine)
  2. {
  3.    m_chaine = copie(chaine.m_chaine);
  4.    m_longueur = longueur(chaine.m_chaine);
  5. }


Ne serait-il pas plus simple de faire:
Code : C++ - Afficher / masquer les numéros de ligne
  1. m_longueur = chaine.m_longueur;


ou alors j'ai loupé une marche...

encore merci pour les tutos...

nihil sum...
 
Hors ligne M@teo21 # Posté le 30/03/2008 15:50:08
Doh ! Nuts. Mmh, donuts !
Avatar
Admins
C'est corrigé merci.

<tuto etat="redaction" mode="venere" target="c++" />

Ce qui se conçoit bien s'énonce clairement,
Et les mots pour le dire arrivent aisément.

Nicolas Boileau (je suis fan)
Autobiographe à ses heures perdues :p
 
Hors ligne lmghs # Posté le 31/03/2008 21:55:51
Groupe : Membres
Citation : DHKold
Je suppose que tu as vu mon commentaire concernant l'auto-affectation. Etant donné que c'est quelque chose qui revient quasiment tout le temps dans la création de classe, ne serait-il pas intéressant de le signaler, si pas directement dans le TP, en commentaire à la fin? Ca peut vraiment pourrir la vie ce genre de chose ^^

J'interviens ici, je viens d'en parler dans les commentaires du tuto.
Il y a effectivement une (deux avec la copie) erreur(s) dans l'opérateur d'affectation, mais pas le test pour contrer l'auto-affectation. (Je l'ai même félicité de ne pas être tombé dans ce piège :P)

Ce test est un contre idiome qui résout un problème qui a moins de chances de se produire que l'autre problème qu'il ne résoud pas (exception-safety), et en plus cette approche est pessimiste.
Je t'invite à consulter la FAQ C++ de developpez, ou de faire des recherches ici, sur developpez, ou sur fclc++.
 
Hors ligne DHKold # Posté le 01/04/2008 00:20:49
Ex-Admin
Avatar
Groupe : Membres
Ah bah merci de me le faire remarquer, je viens de lire le point dans la FAQ de developpez ^^ Très intéressant, et ça montre que ce qu'on apprend en cours n'est pas toujours efficace :p

Une erreur avec votre code? Déboguez avec GDB!
----------
Pack DHemoticons (Utilisation Libre)
Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur Image utilisateur
 
Hors ligne lmghs # Posté le 01/04/2008 03:12:54
Groupe : Membres
"A jour" serait plus juste :(
 

Désolé, les commentaires de cette news sont désactivés, vous ne pouvez pas en ajouter !

Revenir à liste des news

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 87 Zéros connectés | Requêtes SQL 6 requêtes | Temps de génération de la page : Total (SQL) 0.3429s (0.3307s)