CLASSE CSTRING : GESTION DE CHAINES DE CARACTÈRES EN C++

Signaler
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
-
guill76
Messages postés
193
Date d'inscription
mercredi 24 août 2005
Statut
Membre
Dernière intervention
3 juin 2016
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/25609-classe-cstring-gestion-de-chaines-de-caracteres-en-c

guill76
Messages postés
193
Date d'inscription
mercredi 24 août 2005
Statut
Membre
Dernière intervention
3 juin 2016

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és
193
Date d'inscription
mercredi 24 août 2005
Statut
Membre
Dernière intervention
3 juin 2016

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és
16
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
13 septembre 2004

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és
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
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és
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
'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és
16
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
13 septembre 2004

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és
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
1 dernier pr la rte :

if(strcasecmp(ptr, string.getPtr())==0)
return true;
return false;

no comment
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
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;

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...
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
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és
16
Date d'inscription
lundi 9 août 2004
Statut
Membre
Dernière intervention
13 septembre 2004

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és
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
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*