[C++] Pas de copie lors de l'affectation entre objets string?

Pas de copie lors de l'affectation entre objets string? [C++] - C++ - Programmation

Marsh Posté le 07-06-2004 à 21:38:32    

Je me suis dit que j'allais laisser tomber les char* pour me mettre aux string de la STL.
 
Mais il ya quelque chose qui me dérange.
 
Si je fais :
 
string chaine1="Ma chaine de caracteres";
string chaine2 = chaine1;
 
chaine2 et chaine1 pointent tous deux sur "Ma chaine de caractères".  
C'est bien gentil tout ca mais moi je veux modifier chaine2 sans pour autant que chaine1 soit modifiée.
En regardant la doc, j'ai vu la fonction membre copy mais je n'arrive pas a bien comprendre comment elle s'utilise.
 
Un peu d'aide serait bienvenue!

Reply

Marsh Posté le 07-06-2004 à 21:38:32   

Reply

Marsh Posté le 07-06-2004 à 21:49:22    

Relis la doc

Reply

Marsh Posté le 07-06-2004 à 22:02:46    

Bon, j'ai compris l'utilisation de copy mais ca fait aps ce que je veux. Je veux qu'une copie de "Chaine de Caractères" soit placée en mémoire et que chaine2.begin() pointe dessus.  
Or, copy ne fait que recopier les caractères à l'emplacement mémoire pointé par chaine2.begin().
 
Bref, y a quand même un moyen rapide d'effectuer une copie, non ?

Reply

Marsh Posté le 07-06-2004 à 22:06:17    

blakstaf a écrit :


 
Bref, y a quand même un moyen rapide d'effectuer une copie, non ?


 
string str2 = str1;

Reply

Marsh Posté le 07-06-2004 à 22:08:54    

kadreg a écrit :

string str2 = str1;


 
Non

Reply

Marsh Posté le 07-06-2004 à 22:09:59    

Reply

Marsh Posté le 07-06-2004 à 22:12:36    

Ca pointe sur la même chaine. Modifier l'un revient a modifier l'autre. C'est pas ce que j'appelle une recopie (pas comme je la désire!).

Reply

Marsh Posté le 07-06-2004 à 22:13:19    

blakstaf a écrit :

Ca pointe sur la même chaine. Modifier l'un revient a modifier l'autre. C'est pas ce que j'appelle une recopie (pas comme je la désire!).


Tu la modifies comment ?

Reply

Marsh Posté le 07-06-2004 à 22:14:39    

si je fais  
chaine2 = "Nouvelle chaine";
 
chaine1 va egalement me donner "Nouvelle chaine"

Reply

Marsh Posté le 07-06-2004 à 22:16:00    

Jette ton compilo.

Reply

Marsh Posté le 07-06-2004 à 22:16:00   

Reply

Marsh Posté le 07-06-2004 à 22:17:28    

Visual C++ 6.0 .  
Et comme j'ai un projet a faire en utilisant les MFC windows, j'ai pas trop le choix!

Reply

Marsh Posté le 07-06-2004 à 22:20:20    

blakstaf a écrit :

si je fais  
chaine2 = "Nouvelle chaine";
 
chaine1 va egalement me donner "Nouvelle chaine"


 
En C oui, mais en C++, ça m'étonnerait. Tu as essayé ?


Message édité par el muchacho le 07-06-2004 à 22:21:58
Reply

Marsh Posté le 07-06-2004 à 22:21:16    

el muchacho a écrit :

En C oui, mais en C++, ça m'étonnerait. Tu as essayé ?


 
Bien sur !

Reply

Marsh Posté le 07-06-2004 à 22:21:46    

blakstaf a écrit :

Ca pointe sur la même chaine.  


 
Tu utiliserais pas une implémentation de la STL avec un système de copy-on-write des fois ?


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 07-06-2004 à 22:22:03    


Et :
 
string str2(str1);
 
ça donne quoi ?

Reply

Marsh Posté le 07-06-2004 à 22:23:15    

kadreg a écrit :

Tu utiliserais pas une implémentation de la STL avec un système de copy-on-write des fois ?


Sauf que là le copy-on-write marche pas

Reply

Marsh Posté le 07-06-2004 à 22:24:48    

Faut que je fasse du C++ :|


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 07-06-2004 à 22:29:54    

Dion a écrit :

Faut que je fasse du C++ :|


 
Si tu peux t'en passer, n'h"site pas :/


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 07-06-2004 à 22:30:58    

kadreg a écrit :

Si tu peux t'en passer, n'h"site pas :/


 
Et si j'ai le choix entre C et C++ ? :D


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 07-06-2004 à 22:37:02    

el muchacho a écrit :

Et :
 
string str2(str1);
 
ça donne quoi ?


 
Ca effectue la même chose.
 
kadreg > Je sais pas c'est quoi cette histoire de STL avec copy on write.
 
Comme vous m'aviez mis le doute, j'ai téléchargé la derniere version de la STL sur le site de SGI mais ca n'a malheureusement rien changé.

Reply

Marsh Posté le 07-06-2004 à 22:40:14    

C'est quand même bizarre cette histoire. Chez vous, faire string chaine1= chaine2 , ca vous fait une recopie complète ?

Reply

Marsh Posté le 07-06-2004 à 22:41:04    

blakstaf a écrit :

Visual C++ 6.0 .  
Et comme j'ai un projet a faire en utilisant les MFC windows, j'ai pas trop le choix!


 
si tu dois utiliser les MFC, utilise la classe CString et basta.

Reply

Marsh Posté le 07-06-2004 à 22:41:19    

Bon réflexe, il vaut mieux laisser tomber la STL Microsoft.
Tu te plantes qq part. Tu linkes pas avec la bonne STL, ou tu fais pas du C++ mais du C, j'en sais rien.

Reply

Marsh Posté le 07-06-2004 à 22:41:26    

Ça ressemble à qq qui fait un c_str() sur une string puis qui retire le const avec un cast :o

Reply

Marsh Posté le 07-06-2004 à 22:42:58    

Code :
  1. #include <string>
  2. #include <iostream>
  3. int main(int argc, char* argv[])
  4. {
  5. std::string str1 = "bli bla blo";
  6. std::string str2 = str1;
  7. str1.append (" blu" );
  8. std::cout << str1 <<std::endl;
  9. std::cout << str2<<std::endl;
  10. }


 

C:\Program Files\Microsoft Visual Studio\MyProjects\taiste\Debug>taiste
bli bla blo blu
bli bla blo
 
C:\Program Files\Microsoft Visual Studio\MyProjects\taiste\Debug>


 
:o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 07-06-2004 à 22:44:06    

Merci, affaire réglée.


Message édité par el muchacho le 07-06-2004 à 22:44:20
Reply

Marsh Posté le 07-06-2004 à 22:46:40    


 
et moi :O


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 07-06-2004 à 22:47:47    


 
En C, on peut faire des truc dégueulasses
En C++, on peut faire largement pire.
 
Le C++, c'est la zoophilie de l'informatique.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 07-06-2004 à 22:50:42    

Kristoph a écrit :

Ça ressemble à qq qui fait un c_str() sur une string puis qui retire le const avec un cast :o


 
C'est la base du probleme !

Reply

Marsh Posté le 07-06-2004 à 22:52:00    

blakstaf a écrit :

C'est la base du probleme !


 
Bah il faut pas enlever le const.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 07-06-2004 à 22:52:28    

kadreg a écrit :

En C, on peut faire des truc dégueulasses
En C++, on peut faire largement pire.
 
Le C++, c'est la zoophilie de l'informatique.


 
Donc je fais koi ? du Java ? :|


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 07-06-2004 à 22:54:03    

blakstaf a écrit :

C'est la base du probleme !

c'est la base de l'incompréhension

Reply

Marsh Posté le 07-06-2004 à 22:56:59    

blakstaf a écrit :

C'est la base du probleme !


 
 :heink:  
tu peux poster ton code qu'on rigol^H^H^H^H^H voie ?

Reply

Marsh Posté le 07-06-2004 à 22:58:06    

^W ?
^U ?

Reply

Marsh Posté le 07-06-2004 à 22:59:49    

Je comprends plus trop. j'ai changé une option ds Visual C++. (Project->Settings Onglet C/C++ . j'ai choisi "C++ programs" ds Category a la place de "General". j'ai relancé le prog , étonnant, ca fait une recopie!  
 
Je repasse a General, et la ca fonctionne.  
Je suppose qu'il a pas du prendre en compte la derniere version des STL tout à l'heure....
enfin, affaire réglée.

Reply

Marsh Posté le 07-06-2004 à 23:07:44    

Pour ce qui est du probleme avec les CString, c'est que comme vous le savez, les fonctions en MFC n'acceptent pas en paramètre d'entrée les string mais les CString. Donc je suis obligé de passer par un  c_str.
Je récupère donc d'une de mes fonctions un string que je ne veux pas modifier ds une autre variable string qu'on appellera chaine1.
 
Mais comme la recopie ne s'effectuait pas, quans je passais chaine1.c_str() a la fonction MFC, ca me transtypait mon string original.

Reply

Marsh Posté le 07-06-2004 à 23:09:57    

Ce n'est pas encore suffisant ! Même si maintenant la recopie se fait, cela ne veux pas dire qu'il est permis de modifier le résultat de c_str().
 
D'ailleurs, il est formellement interdit de modifier le contenu de c_str() :)

Reply

Marsh Posté le 07-06-2004 à 23:09:59    

ça transtype rien du tout: ça te renvoie un pointeur vers une partie de ta string terminée par un 0, en lecture seule, et valable uniquement dans l'expression courante

Reply

Marsh Posté le 07-06-2004 à 23:11:46    

Ok. Quoi qu'il en soit le problème il vient du fait qu'a la fin du bloc, ca fait appel au destructeur de la classe CString, qui détruit gentiment le string original.

Reply

Marsh Posté le 07-06-2004 à 23:17:25    

blakstaf a écrit :

Ok. Quoi qu'il en soit le problème il vient du fait qu'a la fin du bloc, ca fait appel au destructeur de la classe CString, qui détruit gentiment le string original.


 
Quand on vous disais que les MFC c'est de la merde :)
 
Au moins quand tu construis ta CString, tu dois pouvoir lui dire de ne jamais desalloué le char * d'origine non ?


Message édité par Kristoph le 07-06-2004 à 23:17:35
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed