Bonjour, j'ai 2 nombres ayant comme type std::string. Y a t-il un moyen de les additionner, par exemple en surchargeant l'operateur + ?
merci.
Bonjour, j'ai 2 nombres ayant comme type std::string. Y a t-il un moyen de les additionner, par exemple en surchargeant l'operateur + ?
merci.
Salut,
Etrange comme formulation mais soit !j'ai 2 nombres ayant comme type std::string
Il est tout a fait possible de le faire. Je te laisse aller sur google et taper un truc du genre "C++ surcharge des operateurs" tu verras de suite comment ca fonctionne et quelles possibiltes cela t'offre.
Bon courage
J'ai dej� essayer de surcharger l'operateur + mais sans succes. J'ai regard� un peu sur le net, et pareil.
un indice?
Voil� ce que j'avais tent�...
Et �a serait encore mieux si �a pouvait me retourner le resultat sous forme de std::string.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6 int operator & +(std::string nb1, std::string nb2) { int res; res=nb1+nb2; return res; }
merci
???Voil� ce que j'avais tent�...
Code :
int operator & +(std::string nb1, std::string nb2)
{
int res;
res=nb1+nb2;
return res;
}
Outre les fautes de logique et de syntaxe, pourquoi surcharger cet operateur si c pour mettre a l'interieur :
avec nb1 et nb2 string !!!
Code : S�lectionner tout - Visualiser dans une fen�tre � part res=nb1+nb2;
Sinon dans la doc de la classe string du C++ (tout premier endroit ou il est tres utils de chercher en cas de pb) :
http://www.cppreference.com/cppstrin...operators.html
Tous les operateurs utiles dont + sont deja definis![]()
Ben je sais pas, moi �a me semblais logique ce que j'avais fait
Mais, j'ai pas compris comment faire avec ce qui est dans la doc.
Il y a bien �a:
Mais je suppose que si je passe en parametre: 2 et 6 �a va me retourner 26, et non 8...
Code : S�lectionner tout - Visualiser dans une fen�tre � part string operator+(const string& s1, const string& s2 );
Oula ...
2 : int
6 : int
"2" : string, char*, ... ca depend
si tu fais "2"+"6" ca doit probablement marcher
A revoir les bases des types de donnees C++![]()
hello,
je vois pas trop ce que tu veux faire mais peut �tre que �a peut t'aider:
http://www.cplusplus.com/reference/c...dlib/atoi.html
atoi Convert string to integer (function)
atol Convert string to long integer (function)
atof Convert string to double (function)
strtol Convert string to long integer (function)
Salut � tous !
Personnellement, je me pose la question de la pertinence de repr�senter des chiffres sous forme de cha�nes de caract�res. � mon avis, il faut revoir la conception.
Sinon, au niveau des cha�nes de caract�res, l'op�rateur d'addition est surcharg� et effectue une concat�nation. Ainsi, le programme suivant :
Retourne sur la sortie standard la chaine � abcdef. �
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10 #include <string> #include <iostream> int main (int argc, char **argv) { const std::string chaine1 = "abc"; const std::string chaine2 = "def"; std::cout << chaine1 + chaine2 << std::endl; return 0; } // main
Pour convertir une cha�ne de caract�res en entier, il existe deux m�thodes en C++. La premi�re vient du C, elle consiste � utiliser la fonction atoi de la biblioth�que standard C :
Le code pr�c�dent retourne � 14 � sur la sortie standard.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10 #include <string> #include <iostream> #include <cstd> int main (int argc, char **argv) { const std::string chaine = "12"; const int entier = std::atoi(chaine) + 2; std::cout << entier << std::endl; } // main
La deuxi�me m�thode consiste � utiliser un flux sur une cha�ne de caract�res :
Ce code �galement affiche � 14 � sur la sortie standard.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12 #include <string> #include <iostream> #include <sstream> int main (int argc, char **argv) { std::string chaine = "12"; std::istringstream ist (chaine); int entier; ist >> entier; std::cout << entier + 2 << std::endl; } // main
Pour surcharger l'op�rateur d'addition, tu peux faire �a :
Mais je te d�conseille cette approche. � mon avis il faut revoir la fa�on dont tu stockes tes donn�es.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9 #include <string> #include <cstd> // ... int operator + (const std::string &chaine1, const std::string &chaine2) { return std::atoi(chaine1) + std::atoi(chaine2); } // int operator + (const std::string &, const std::string &)
� bient�t.
Le Farfadet Spatial
...O� les fonction convertir_en_int et convertir_en_string restent � d�terminer...
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7 std::string operator+(std::string nb1, std::string nb2) { int res = convertir_en_int(nb1) + convertir_en_int(nb2); return convertir_en_string(res); }
Cela dit, c'est curieux de red�finir cet op�rateur pour les std::string alors qu'il existe deja.
Du coup tu ne pourras plus faire quelque chose du genre :
Edit : grill�
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5 std::string a = "chaine alpha1"; std::string b = "chaine alpha2"; a + b;
Salut � tous !
Je suis bien d'accord.
Ceci, en revanche, n'est pas tout � fait exacte. Si jamais l'op�rateur d'addition est surcharg� de la fa�on que j'ai propos�e, alors ceci :Du coup tu ne pourras plus faire quelque chose du genre :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5 std::string a = "chaine alpha1"; std::string b = "chaine alpha2"; a + b;
Affichera sur la sortie standard : � 122 = 14. �
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6 const std::string chaine1 = "12"; const std::string chaine2 = "2"; const std::string chaine3 = chaine1 + chaine2; const int entier = chaine1 + chaine2; std::cout << chaine3 << " = " << entier << std::endl;
Par contre, le compilateur indiquera une ambigu�t� au moment de la compilation pour le code suivant :
� bient�t.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4 const std::string chaine1 = "12"; const std::string chaine2 = "2"; std::cout << chaine1 + chaine2 << std::endl;
Le Farfadet Spatial
Sans doute qu'il r�cup�re les valeurs d'un flux externe. Un fichier par exemple.
La meilleure solution consiste � proc�der en 2 �tapes:
1/ on transforme la chaine de caract�res en int (et s'il vous plait, ar�tez avec atoi et autres joyeuset�s du C, nous sommes sur un forum c++). La solution est, une fois de plus, dans la faq: ici
2/ additionner les deux entiers.
Mais koala va vous expliquer tout �a en d�tail
edit: quant � la surcharge de d'addition de string, elle est � proscrire d�finitivement pour plusieurs raisons, et notamment pour la simple et bonne raison que l'on ne pourra plus concat�ner des strings avec l'operateur +.
edit2:
As-tu test�? Non. Si l'operateur + est surcharg� comme tu le dis, string3 = string1 + string2 ne compilera pas.Envoy� par farfadet spatial
Salut,
Il faut commencer par convertir chaque chaine en entier.
La classe stringstream est l� pour t'y aider
Je ne crois vraiment pas que la surcharge de l'op�rateur + soit r�ellement conseill�e...
L'id�al serait plut�t, selon moi, de cr�er une classe personnelle qui se chargera de la transformation "transparente" de la chaine de caract�res en entier, et utilisera directement la valeur convertie, avec �ventuellement les op�rateurs + et -
Horreur et calamit�...
les fonctions ato* sont � �viter autant que possible, comme c'est le cas de toutes les fonctions issues directement du C.
Le C++ est un langage qui fournit �norm�ment de possibilit�s plus s�curisantes � l'emploi que la grosse majorit� des fonctions h�rit�es du C, et il est donc fortement recommand� de leur pr�f�rer � chaque fois les possibilit�s C++.
Dans le cas qui nous int�resse, les *stringstream sont pleinement qualifi�s pour effectuer le travail.
Ainsi, un simple code du genre de
fera parfaitement l'affaire
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 int additionne(const std::string& i1, const std::string& i2) { /* déclare un flux de conversion */ std::stringstream ss; /* introduit les valeurs sous forme de chaines dans le flux de conversion */ ss<<s1<<" "<<s2; int op1; int op2; if(!(ss>>op1>>op2)) { /* ce qu'il faut faire si l'une des chaines n'est pas compatible avec * les nombres entiers */ } /* renvoie l'addition des deux opérandes récupérés. */ return op1+op2; }(requi�re un #include <sstream> avant la d�claration de "ss"
)
A m�diter: La solution la plus simple est toujours la moins compliqu�e
Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
mon tout nouveau blog
Merci pour toutes vos r�ponses. Je vais essayer tout �a. Et pour r�pondre � certains qui se demandent pourquoi je dois faire �a, c'est que j'ai des variables qui prennent leur valeurs dans le contenu d'un fichier texte.
ex:
Le fichier texte:
Et dans mon code j'ai une variable std::string saQuantit� a laquelle j'affecte la quantit� (en string) lu dans le fichier texte.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3 Nom: toto Année: 2001 Quantité: 6
Mais par la suite je peux avoir besoin d'additionner deux quantit�s. Voil� pourquoi.
Merci encore.
Bonjour,
Personnellement je ne suis pas tout � fait d'accord avec le fait de ne pas utiliser atoi.
Le comportement de la fonction atoi est d�crit ici, et l'on peut voir qu'il se comporte aussi surement qu'un stringstream.
Et utiliser la fonction atoi est beaucoup plus l�ger que de cr�er une classe, d'allouer la chaine de caract�res de la classe dynamiquement, de copier tous les caract�res dans la stringstream, et d'utiliser un flux pour convertir en int.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4 int additionne(const std::string& i1, const std::string& i2) { return atoi(i1.c_str())+atoi(i2.c_str()); }Pour moi la premi�re fonction est pr�f�rable � tous points de vue. Les classes de la STL sont tr�s utiles, mais je ne vois aucune raison valable de ne pas utiliser certaines fonctions du C pur, quand c'est plus pratique, plus court, et plus performant.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8 int additionne(const std::string& i1, const std::string& i2) { std::stringstream ss; ss<<s1<<" "<<s2; int op1 = 0; int op2 = 0; return op1+op2; }
Salut � tous !
Oui, c'est bien pour �a que je pense et visiblement je ne suis pas le seul, qu'il ne vaut mieux pas enregistrer l'entier dans une cha�ne, mais utiliser un flux. Peut-�tre n'ai-je pas �t� assez clair.
Au temps pour moi : je viens de le tester avec gcc et �a ne fonctionne pas, en effet.Envoy� par r0d
etEnvoy� par r0d
Ah ! Ben fl�te, alors... Il va falloir que j'arr�te d'utiliser les fonctions de cmath, sous pr�texte que c'est du C... �a tombe mal, j'en ai besoin tous les jours.Envoy� par koala01
Je suis bien d'accord d'une part que trop souvent on trouve un m�lange de C et C++ imbuvable, g�n�ralement peu efficace et de toute fa�on difficile � lire et � maintenir. Et ceci est on ne peut plus vrai :
Et oui, nous sommes bien d'accord, lorsqu'on lit les donn�es dans un fichier, les flux sont une bien meilleure solution, car plus s�curis�s et permettant beaucoup plus de traitements de mani�re simple et �l�gante et que les fonctions de la biblioth�que standard C.Envoy� par koala01
Cela dit, la biblioth�que standard C a �t� encapsul�e pour �tre utilis�e proprement en C++ et parfois c'est une solution propre, efficace et �l�gante. Par exemple, lorsque dans ma ligne de commande, j'attends en deuxi�me argument un entier, il n'y a aucun probl�me pour �crire :
Plut�t que de faire un flux sur une cha�ne, qui demande tout de m�me un peu plus de travail, tout �a pour un unique entier...
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2 int val = atoi(argv[2]);
� bient�t.
Le Farfadet Spatial
Ce qu'il y a, c'est que la grosse majorit� des cas o� tu va avoir besoin de convertir un entier en une chaine et vice-versa (voire un objet en chaine), c'est dans un contexte de flux...
Ce sera parce que tu voudra lire ou �crire dans un fichier, ou parce que tu voudra envoyer ou recevoir les donn�es au travers d'un syst�me quelconque de transmission, bas� sur la transmission de caract�res.
D�s lors, il semble tout de suite logique de passer par des flux, et le flux de conversion stringstream (i ou o selon le cas) est un pr�tendant des plus logique![]()
A m�diter: La solution la plus simple est toujours la moins compliqu�e
Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
mon tout nouveau blog
Salut � tous !
Dans la majorit� des cas, oui, mais pas toujours... Sachons avoir un peu de souplesse (je dis �a pour moi aussi) ! D'autant que, comme le fait remarquer Coyotte504, les fonctions ato* ne sont pas moins s�curis�es que des flux, juste beaucoup moins versatiles.
Cela dit, maintenant, nous savons que Nyko17 est en train de lire un fichier, donc, en effet, nous pouvons lui donner ce judicieux conseil : utilise des flux, sacrebleu !
� bient�t.
Le Farfadet Spatial
J'ai encore un petit probl�me:
Voici l'en-t�te de mon fichier:
Voici la fonction concern�e:
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5 #include <sstream> #include <iostream> #include <list> #include <fstream>
Et les erreurs:
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 std::string ListeVins::convertiEnIntetAjoute(std::string & Qt1, std::string & Qt2) { std::istringstream iss( Qt1 ); //ici int laQt1; iss >> laQt1; std::istringstream iss( Qt2 ); // et là int laQt2; iss >> laQt2; int res= laQt1 + laQt2; std::ostringstream oss; oss << res; std::string result = oss.str(); return result; }
ici: erreur: 'std::istringstream iss' previously declared here
l�: erreur: redeclaration of 'std::istringstream iss'
Partager