CLASSE CSTRING : GESTION DE CHAINES DE CARACTÈRES EN C++
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 2004
-
23 août 2004 à 14:52
guill76
Messages postés193Date d'inscriptionmercredi 24 août 2005StatutMembreDernière intervention 3 juin 2016
-
6 août 2007 à 19:11
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
guill76
Messages postés193Date d'inscriptionmercredi 24 août 2005StatutMembreDernière intervention 3 juin 2016 6 août 2007 à 19:11
Correction:
Il faut un test supplémentaire pour ne pas réallouer la place pour la chaine :
CString &CString::operator=(const CString& string)
{
if (this!=&string)
{
reallocation(string.length()+1);
strcpy(ptr, string.getPtr());
}
return (*this);
}
guill76
Messages postés193Date d'inscriptionmercredi 24 août 2005StatutMembreDernière intervention 3 juin 2016 4 août 2007 à 00:03
Bonjour,
Je viens d'utiliser cette classe de string qui est très bien faite, je trouve, mais j'ai rencontré le bug suivant:
L'auto-affection désalloue la mémoire mais ne la recrée pas.
voici le code utilisé avec gcc sur mingw:
int main()
{
CString test="test d'auto-affectation";
cout<<test<<endl;//affiche "test d'auto-affectation"
test=test;
cout<<test<<endl;//affiche o$? en sortie
}
Il faudrait peut-etre créer une variable temporaire lorsque this=(objet de recopie) avant la réallocation?
Soilwork9
Messages postés16Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention13 septembre 2004 25 août 2004 à 08:05
djl > Yep, mais bon, ca change rien à la présence de equals dans ma classe ;) Et puis dans le cas des String, on trouve aussi les operateurs +, += et == (et ca ne m'est jamais venu a l'idee de faire une classe qui derive de String : ca marche tellement bien, lol)
Nono > Je préfère faire des fonctions aussi claires et lisibles que possible, et dont le nom indique ce qu'elles font. Si je commence a faire des methodes qui prennent 50 parametres et qui font 50 trucs differents dans la meme methode, pour une classe aussi simple que celle-la, je ne sais pas ou je vais me retrouver en attaquant un gros projet !
Et en ce qui concerne les "doublons" (les méthodes "Java"), c'est comme tout : c'est inutile si tu ne t'en sers pas ! ^_^
J'ai commencé à regarder ta BString, et je suis... plutot perplexe. Mais ce n'est pas l'endroit pour en parler, donc je te laisserai un message sur la page appropriée.
++
Soilwork
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 24 août 2004 à 18:11
c'est ridicule de s'embeter avec les noms en c++, les namespaces sont la pour ca
Soilwork9 > si en java c'est equals cc'est parce que justement java ne supporte pas (entre autre) la surcharge des operateurs
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011 24 août 2004 à 15:19
'lo
return (strcasecmp( ... ) ==0);
va très bien...
l'utilisation du Cxxx est effectivement une bonne convention & j'ai déjà expliqué pq j'aV opté pr des Bxxx.
Dans le cas des string, tu peux eventuellement géner des personnes ne voulant reprendre que des parties de ton codes mais après, C toi qui voit.
pour ma bibli
attend dc que je mette à jour toutes mes bibli
(prochainement)
pour les substring, je pense que tu m' a compris
sinon, fais comme tu veux,
je pense qu'il vaut mie avoir un nombre plus petit de fonctions avec eventuellementplus de paramètres(éventuellement optionnels)
mais C un choix et po de pb si tu opte pr une politique d'une multitude de petites fonctions...
autrement j'aV remarqué le parallèle à java... je trouve ces doublons inutils mais pourquoi pas...
Bon, je completerai plus tard
++
Nono.
Soilwork9
Messages postés16Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention13 septembre 2004 24 août 2004 à 14:58
C'est marrant, je savais que tu posterais un commentaire ici ;) Je t'ai deja vu faire de la pub pour tes BString dans des commentaires pour d'autres classes de chaines, en survolant un peu le contenu de ce site. ~_^ En tout cas, merci pour le "Bien..".
En ce qui concerne le nom de la classe, a vrai dire, les MFC... Erm, je m'en moque un peu...! Je nomme mes classes comme ca (C + Nom de classe : CString, CMachin, CTruc), je vais pas faire une exception parce que c'est deja pris par un truc que je n'utilise pas de toute facon ;) Pour la réallocation, effectivement, tu as raison, et c'est volontaire et normal!
Les méthodes equals, et les deux substring, ce sont des equivalences avec Java, pour ceux qui ont pris l'habitude d'utiliser les String de ce langage (Moi, en l'occurence!). Tu aurais aussi pu demander pourquoi append alors qu'il y a les operateurs + et +=, etc...
Je ne pense pas que rassembler les méthodes pour changer la casse en une seule soit une bonne idee : comme ca, le nom de la méthode indique clairement ce qu'elle fait, et je ne vois pas trop ou est l'avantage de ce que tu proposes (??). D'ailleurs en réalité, je vois pas exactement ce que tu proposes!
Pour ton dernier exemple, j'aurais certes pu ecrire
return (! strcasecmp( ... ) );
Mais je ne trouve pas ca vraiment clair. Et puis ca change pas grand chose, a vrai dire.
Voila, merci pour les commentaires. J'irai voir ta BString! ^^
++
Soilwork
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011 24 août 2004 à 10:01
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011 24 août 2004 à 09:55
rq2 : pq des ";" après chaque méthode définie ds le header?
à quoi sert equals, == suffit
une des 2 fonctions suivantes, est inutiles:
CString substring(int index) const;
CString substring(int index, int length) const;
il suffit de faire le distingo au sein d'une seule
CString substring(int index, int length=-1) const;
magic_Nono
Messages postés1878Date d'inscriptionjeudi 16 octobre 2003StatutMembreDernière intervention16 mars 2011 24 août 2004 à 09:35
Bien...
Je déconseille cependant le nom de CString deja utilisé par les MFC, ça peut créer des confusions...
Une remarque : ton opérateur de réallocation vire tout ce que pouvait contenir ta chaine...
Magicalement...
Nono.
Soilwork9
Messages postés16Date d'inscriptionlundi 9 août 2004StatutMembreDernière intervention13 septembre 2004 23 août 2004 à 16:34
Salut, et merci pour ton message!
Pour la longueur, tu as surement raison, je vais voir si je peux mettre a jour une variable représentant la longueur dans la méthode reallocation. Mais je dois verifier qu'il n'y a aucune méthode qui mette a jour la chaine sans passer par reallocation (raccourcissement de chaine en inserant juste un \0, par exemple)...
Pour le const : ARF! Ne me demande pas pourquoi j'ai fait ca, je ne saurais pas te repondre ;p Je devais etre dans une periode const a ce moment la, j'en mettais partout, lol. 'fin bon, c'est enlevé, et on fera comme si ca n'etait jamais arrivé ^_^
setPtr ne sert a rien, un peu comme isPalindrome peut-etre (lol), mais en plus setPtr est mal fait (mauvaise utilisation de strcpy, a priori... Pas de réallocation). Vais peut-etre le virer aussi ;)
Merci en tout cas, et a plus tard!
++
Soilwork
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 23 août 2004 à 14:52
deja bravo pour le code, la classe est assez complete et fonctionnelle
quelque remarque en passant, tu devrais stocker la taille dans une variable et faire un ascesseur inline plutot que de faire appel a chaque fois à strlen, ca peux devenir penalisant lors de plusieurs appels dans une boucle
ne specifie pas const une variable passé par
valeur "const int number" ca n'a aucune utilité
a quoi sert setPtr ? tu as deja le constructeur char* et l'operateur = char*
6 août 2007 à 19:11
Il faut un test supplémentaire pour ne pas réallouer la place pour la chaine :
CString &CString::operator=(const CString& string)
{
if (this!=&string)
{
reallocation(string.length()+1);
strcpy(ptr, string.getPtr());
}
return (*this);
}
4 août 2007 à 00:03
Je viens d'utiliser cette classe de string qui est très bien faite, je trouve, mais j'ai rencontré le bug suivant:
L'auto-affection désalloue la mémoire mais ne la recrée pas.
voici le code utilisé avec gcc sur mingw:
int main()
{
CString test="test d'auto-affectation";
cout<<test<<endl;//affiche "test d'auto-affectation"
test=test;
cout<<test<<endl;//affiche o$? en sortie
}
Il faudrait peut-etre créer une variable temporaire lorsque this=(objet de recopie) avant la réallocation?
25 août 2004 à 08:05
Nono > Je préfère faire des fonctions aussi claires et lisibles que possible, et dont le nom indique ce qu'elles font. Si je commence a faire des methodes qui prennent 50 parametres et qui font 50 trucs differents dans la meme methode, pour une classe aussi simple que celle-la, je ne sais pas ou je vais me retrouver en attaquant un gros projet !
Et en ce qui concerne les "doublons" (les méthodes "Java"), c'est comme tout : c'est inutile si tu ne t'en sers pas ! ^_^
J'ai commencé à regarder ta BString, et je suis... plutot perplexe. Mais ce n'est pas l'endroit pour en parler, donc je te laisserai un message sur la page appropriée.
++
Soilwork
24 août 2004 à 18:11
Soilwork9 > si en java c'est equals cc'est parce que justement java ne supporte pas (entre autre) la surcharge des operateurs
24 août 2004 à 15:19
return (strcasecmp( ... ) ==0);
va très bien...
l'utilisation du Cxxx est effectivement une bonne convention & j'ai déjà expliqué pq j'aV opté pr des Bxxx.
Dans le cas des string, tu peux eventuellement géner des personnes ne voulant reprendre que des parties de ton codes mais après, C toi qui voit.
pour ma bibli
attend dc que je mette à jour toutes mes bibli
(prochainement)
pour les substring, je pense que tu m' a compris
sinon, fais comme tu veux,
je pense qu'il vaut mie avoir un nombre plus petit de fonctions avec eventuellementplus de paramètres(éventuellement optionnels)
mais C un choix et po de pb si tu opte pr une politique d'une multitude de petites fonctions...
autrement j'aV remarqué le parallèle à java... je trouve ces doublons inutils mais pourquoi pas...
Bon, je completerai plus tard
++
Nono.
24 août 2004 à 14:58
En ce qui concerne le nom de la classe, a vrai dire, les MFC... Erm, je m'en moque un peu...! Je nomme mes classes comme ca (C + Nom de classe : CString, CMachin, CTruc), je vais pas faire une exception parce que c'est deja pris par un truc que je n'utilise pas de toute facon ;) Pour la réallocation, effectivement, tu as raison, et c'est volontaire et normal!
Les méthodes equals, et les deux substring, ce sont des equivalences avec Java, pour ceux qui ont pris l'habitude d'utiliser les String de ce langage (Moi, en l'occurence!). Tu aurais aussi pu demander pourquoi append alors qu'il y a les operateurs + et +=, etc...
Je ne pense pas que rassembler les méthodes pour changer la casse en une seule soit une bonne idee : comme ca, le nom de la méthode indique clairement ce qu'elle fait, et je ne vois pas trop ou est l'avantage de ce que tu proposes (??). D'ailleurs en réalité, je vois pas exactement ce que tu proposes!
Pour ton dernier exemple, j'aurais certes pu ecrire
return (! strcasecmp( ... ) );
Mais je ne trouve pas ca vraiment clair. Et puis ca change pas grand chose, a vrai dire.
Voila, merci pour les commentaires. J'irai voir ta BString! ^^
++
Soilwork
24 août 2004 à 10:01
if(strcasecmp(ptr, string.getPtr())==0)
return true;
return false;
no comment
24 août 2004 à 09:55
à quoi sert equals, == suffit
une des 2 fonctions suivantes, est inutiles:
CString substring(int index) const;
CString substring(int index, int length) const;
il suffit de faire le distingo au sein d'une seule
CString substring(int index, int length=-1) const;
idem, rassemble
CString &toLowerCase(); //En minuscules
CString &toUpperCase(); //En majuscules
CString &capitalize();
en une seule fonc
etc
sinon, je retrouve po mal mes BString & +
Magicalement...
24 août 2004 à 09:35
Je déconseille cependant le nom de CString deja utilisé par les MFC, ça peut créer des confusions...
Une remarque : ton opérateur de réallocation vire tout ce que pouvait contenir ta chaine...
Magicalement...
Nono.
23 août 2004 à 16:34
Pour la longueur, tu as surement raison, je vais voir si je peux mettre a jour une variable représentant la longueur dans la méthode reallocation. Mais je dois verifier qu'il n'y a aucune méthode qui mette a jour la chaine sans passer par reallocation (raccourcissement de chaine en inserant juste un \0, par exemple)...
Pour le const : ARF! Ne me demande pas pourquoi j'ai fait ca, je ne saurais pas te repondre ;p Je devais etre dans une periode const a ce moment la, j'en mettais partout, lol. 'fin bon, c'est enlevé, et on fera comme si ca n'etait jamais arrivé ^_^
setPtr ne sert a rien, un peu comme isPalindrome peut-etre (lol), mais en plus setPtr est mal fait (mauvaise utilisation de strcpy, a priori... Pas de réallocation). Vais peut-etre le virer aussi ;)
Merci en tout cas, et a plus tard!
++
Soilwork
23 août 2004 à 14:52
quelque remarque en passant, tu devrais stocker la taille dans une variable et faire un ascesseur inline plutot que de faire appel a chaque fois à strlen, ca peux devenir penalisant lors de plusieurs appels dans une boucle
ne specifie pas const une variable passé par
valeur "const int number" ca n'a aucune utilité
a quoi sert setPtr ? tu as deja le constructeur char* et l'operateur = char*