tu fais des comparaisons entre le pointeur this->attribut et une chaine de caractère .. dans mon cas comment ferais-je ? à quoi correspond 'attribut' ?
tu fais des comparaisons entre le pointeur this->attribut et une chaine de caractère .. dans mon cas comment ferais-je ? à quoi correspond 'attribut' ?
Non, je compare deux entier. Pour toi "attribut" est ton attribut char* m_chaine qui contient ta chaîne.
problème : ça tient pas debout ! Ben oui comme ce n'est pas une fonction membre, elle ne eut pas utiliser "this" et n'as pas accès à m_chaine ... et ne peut pas être const non plus .
En membre, il y a toujours un argument suplémentaire implicite. Donc, 2 + 1 = 3. Pas pratique pour comparer deux choses.
Donc 2 solutions
1- membre à un seul argument explicite
2- libre à deux arguments explicites.
La seconde est meilleure que la première pour des raisons de symétrie -- pas besoin de rajouter une version libre qui prend un const char* et un ZString, dans cet ordre. C'est à dire que si ton constructeur d'initialisation/conversion n'est pas déclaré "explicit", tu pourras écrire indifféremment:
constbool eq1 = "toto" == maZString;
constbool eq2 = maZString == "toto" ;
constbool eq3 = maZtring1 == maZString2;
La version membre n'autorise que 2 et 3 (vu que l'argument implicite ne peut être que le premier d'un opérateur membre), tandis que la version libre supporte les 3 tests.
Bref, c'est symétrique. Et c'est pour cela que je critique systématiquement l'écriture des opérateurs binaires en membre : c'est enseigner un truc qui s'assimile à une perte de temps vu que c'est l'autre version qu'il faut préférer.
(Je suis allé vite, c'est traité plus en détails dans Guru Of the Week je crois).
PS: un autre truc avec lequel j'ai du mal, c'est avec les déclinaisons de
if(exprBooleenne)
returntrue;
else
returnfalse;
alors qu'un simple
return exprBooleenne;
fait parfaitement l'affaire.
Apprennez à manipuler des expressions booléennes.
PS: les const char* se comparent (entre autres), avec strcmp().
Mais c'est une fonction membre, regarde au moins le code que je te donne.
Si tu veux une alternative tu peux l'utiliser comme fonction libre mais il faut la déclarer amie pour qu'elle puisse accéder aux attributs :
Comme ceci :
#include <iostream>
class Test {
public :
Test(int init);
friendbool operator==(const Test &, const Test &);
private:
int attribut;
};
Test::Test(int init){
attribut=init;
}
bool operator==(const Test &compared,const Test &toCompare){
PS: un autre truc avec lequel j'ai du mal, c'est avec les déclinaisons de
...
alors qu'un simple
...
fait parfaitement l'affaire.
Apprennez à manipuler des expressions booléennes.
@darkangel75: implémenter strcmp() n'est pas dur (il me semble que c'etait en exercice dans le cours sur les chaines de charactère) et c'est pour ca que j'ai dit que op[]() pouvait etre utile
edit:
Citation : darkangel75
UP : @ lmghs : ton idée de la méthode externe est bien mais du coup elle n'est pas appellée lors d'une comparaison de ZString ...
Pour la réponse du TP de Mateo en C++,
à la question de la surcharge de l'opérateur de comparaison ==,
voici ma solution, en calquant sur sa trame et son style :
Dans la classe ZString, les prototypes des 2 méthodes suivantes :
bool operator==(const ZString &chaine);
bool operator==(constchar *chaine);
Et l'implémentation de ces méthodes dans le fichier source correspondant :
bool ZString::operator==(const ZString &chaine)
{int compteur = 0;
for(int i = 0; i < m_longueur; i++)
if(chaine.m_chaine[i] == m_chaine[i])
compteur++;
if(compteur == m_longueur)
returntrue;
else
returnfalse;}
bool ZString::operator==(constchar *chaine)
{int compteur = 0;
for(int i = 0; i < m_longueur; i++)
if(chaine[i] == m_chaine[i])
compteur++;
if(compteur == m_longueur)
returntrue;
else
returnfalse;}
Il n'y a donc qu'un seul paramètre pour chacune des méthodes comme dans l'exemple du cours.
Les méthodes ne sont pas libres mais bel et bien des membres de notre classe dans ce cas.
Je trouve cela plus propre d'ailleurs .
Il te manque donc une définition (symétrie oblige!) et des const.
/me adepte du DRY (je dis ça pour le code dupliqué, pas parce que tu n'as pas lu ce que j'ai écris -- NB il y a duplications dans std::string pour raisons d'optimisation je suppose)
Au fait, il y a des dépassements de buffer dans tes fonctions -- il faut interdire d'ajouter '\0' pour les prévenir par effet de bord.
J'avais failli ne pas retrouver le mot sur les interfaces généralisés sur GOTW (c'est aussi traité dans XC++ ; et regarder les liens en bibliographie, en particulier le 1er). Et j'ai aussi le document de Stepanov à te proposer: http://www.stepanovpapers.com/notes.pdf (p21)
(Vu qu'il y en a 2-3 ici qui commencent à se cultiver, j'ai lâché les liens. Interro écrite dans 6 mois )
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
* Un wrapper C++ pour sqlite * Une alternative a boost units