const string & Class::Methode()

const string & Class::Methode() - C++ - Programmation

Marsh Posté le 09-09-2003 à 21:43:11    

bonsoir,  
j'ai une classe qui contient une chaine std::string, et je voudrais qu'un de ses méthodes retourne un référence de cette chaine car -dites moi si c'est faux- retourner une référence ne devrait pas copier la chaine pour la retourner à l'appelant ?
 

Code :
  1. using namespace std;
  2. class Class
  3. {
  4.    string str;
  5. public:
  6.    const string & GetString()
  7.    {
  8.       return str;
  9.    }
  10. };
  11. // ailleurs dans le code
  12. Class a;
  13. string s(a.GetString());


 
lorsque je compile la définition de classe, pas d'erreur, mais lorsque je compile du code qui appelle cette méthode(la 2eme partie), erreur de cast...
 
je suppose que c'est parce que GetString doit retourner une référence mais renvoit l'objet lui-même, comment faire pour renvoyer une référence de str ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-09-2003 à 21:43:11   

Reply

Marsh Posté le 09-09-2003 à 21:47:56    

Code :
  1. #include <string>
  2. using std::string;
  3. class Foo
  4. {
  5.   string s;
  6. public:
  7.   Foo(const string &str)
  8.     : s(str)
  9.   {}
  10.   const string & get() const
  11.   {
  12.     return this->s;
  13.   }
  14. };
  15. int main()
  16. {
  17.   Foo f("hello" );
  18.   string s(f.get()); // copie
  19.   const string &ref(f.get()); // capture par référence
  20. }

Reply

Marsh Posté le 09-09-2003 à 21:49:23    

aaaah merci  :jap:


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-09-2003 à 22:14:48    

est-ce que si on compare 2 références d'objets avec l'opérateur == il va comparer les références ou comparer les 2 objets avec leur opérateur == ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-09-2003 à 22:22:28    

les références n'existe pas vraiment, ce ne sont pas des objets, mais des alias. donc toute manipulation agit comme avec l'objet

Reply

Marsh Posté le 09-09-2003 à 22:25:10    

d'accord, merci  :jap:


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 10-09-2003 à 00:16:36    

G pas compris ce qui posait pb ds le code de BlackGoddess  :??:

Reply

Marsh Posté le 10-09-2003 à 09:30:13    

const string & GetString()
 
=>>
 
const string & GetString() const


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 10-09-2003 à 09:38:45    

ne change rien

Reply

Marsh Posté le 10-09-2003 à 09:48:36    

bin c ce qui embetait mon compilo en tout cas, j'ai essayé :
 
const string & get()
{  
  return this->s;  
}
 
ca marchait toujours pas, puis j'ai essayé :
 
const string & get() const
{  
  return s;  
}
 
ca marchait !?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 10-09-2003 à 09:48:36   

Reply

Marsh Posté le 10-09-2003 à 09:49:47    

Fait voir le bout de code où tu appelais la méthode.


---------------
Le Tyran
Reply

Marsh Posté le 10-09-2003 à 09:51:10    

mmh je l'ai pas ici, je le posterais ce soir de chez moi  :sweat:


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 10-09-2003 à 21:21:25    

Code :
  1. class Plugin
  2. {
  3.   string _name;
  4. public:
  5.   const string & GetName() const;
  6. };
  7. class PluginRef
  8. {
  9.   Plugin* plugin;
  10. public:
  11.   string GetPluginName() const { if(plugin) return string(plugin->GetName()); else return string("" ); }
  12. };
  13. const string & Plugin::GetName() const
  14. {
  15. return _name;
  16. }


 
ce sont des bouts de code de divers fichiers.
(les def de classes sont pas entières, j'ai mis que la partie dont on parle)


Message édité par blackgoddess le 10-09-2003 à 21:22:15

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 10-09-2003 à 23:53:17    

Bon, ma connaissance du C++ est plus théorique que pratique, mais le pb initial n'était pas plutôt une absence de cast :
  const string & GetString()  
  {  
     return str;  
  }
 
au lieu de :
  const string & GetString()  
  {  
     return (const string)str;  
  }
 
(je m'excuse d'utiliser les cast style C, je ne maitrise pas encore les nouveaux)
 
Et du coup, je ne comprend pas comment le rajout du const à la fin de la déclaration a pu supprimer l'erreur de compil ???
Je croyais qe ça ne servait qu'à autoriser l'appel de la fonction sur des objets constants.
 
Merci de m'éclairer ...


Message édité par Enidan le 11-09-2003 à 00:51:22
Reply

Marsh Posté le 11-09-2003 à 00:44:34    

Hmmm ... Ca sent le [:taz]


---------------
last.fm
Reply

Marsh Posté le 11-09-2003 à 00:50:46    

toi t'as vraiment rien compris ...

Reply

Marsh Posté le 11-09-2003 à 01:40:49    

1) jamais de cast en C
2) quand on ne sait pas et qu'on ne maitrise rien, il vaut mieux de mander un commentaire de code plutot que de sortir une ignominie
3) les cast sont des trantypages, pas des modificateurs de qualificatifs
4) const_cast le mal nommé fait sauter cette constance. dans les programmes de débutant, son utilisation indique une erreur de conception à coup sur
5) pas besoin de cast ici (voir 1, 2, 3, 4)
6) programmer c'est tout sauf chercher à supprimer les messages d'erreur.
 

Citation :

ma connaissance du C++ est plus théorique que pratique

le genre de bidouille que tu nous montre indique clairement le contraire. en plus tu aurais la mention "code sans effet"
 
 
désolé d'être cassant, mais je tenais à justifier un peu vu le strike, mais il est tard, alors je prends pas de pinceaux

Reply

Marsh Posté le 11-09-2003 à 07:57:00    

Taz a écrit :

mais il est tard, alors je prends pas de pinceaux


des pincettes, pas des pinceaux

Reply

Marsh Posté le 11-09-2003 à 08:15:37    

Ptet qu'il veut lui peindre un "n00b" sur le front :p
(sans vouloir vexer le type et d'ailleurs j'ai meme pas le courage de page down pour voir son nick)

Reply

Marsh Posté le 11-09-2003 à 08:47:34    

Bon,
 
Réponses à Taz :
1), 3) et 4) G pas dit qu'il fallait caster à tout bout de champ, je demande juste si c t pas ça le pb. J'aurais aussi pu virer le const dans le type retourné
6) Evidemment, mais ça peut être utile de les comprendre, non ?
2) Je n'ai fait que demander une explication, que je sache, pas proposer la solution du siècle, étant donné que je ne maîtrise pas
5) Au final, g tjs pas compris le pb. Vive la pédagogie !

Reply

Marsh Posté le 11-09-2003 à 09:01:02    

J'en profite pour reposer mes questions une dernière fois, au cas où.
 
Pkoi ça ne marche pas (hypothèse : à cause du const ?) :
const string & get()  
{  
 return this->s;  
}  
 
Alors que ça marche :
const string & get() const  
{  
 return s;  
}  
 
Dans la 2ème version, le "const" de la fin n'est pas destiné simplement à autoriser l'appel de la fonction sur des objets constants ?

Reply

Marsh Posté le 11-09-2003 à 13:42:05    

c'est ça. donc on comprends clairement que const this ou pas const, il n'y a aucun problème a renvoyer une const & (la réciproque est fausse)

Reply

Marsh Posté le 11-09-2003 à 18:00:53    

Citation :

Dans la 2ème version, le "const" de la fin n'est pas destiné simplement à autoriser l'appel de la fonction sur des objets constants ?


-> ah :) voilà l'explication :), je me demandais a quoi il servait :p


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 11-09-2003 à 18:41:58    

Enidan a écrit :


Pkoi ça ne marche pas (hypothèse : à cause du const ?) :
const string & get()  
{  
 return this->s;  
}  
 
Alors que ça marche :
const string & get() const  
{  
 return s;  
}  


 
A moins que mon cerveau n'soit mort, les deux devraient fonctionner.. simplement qu'il faudra toujours copier le string si tu veux le modifier, que l'instance de la classe soit constante ou pas..

Reply

Marsh Posté le 11-09-2003 à 18:46:36    

Ashe2 a écrit :


 
A moins que mon cerveau n'soit mort, les deux devraient fonctionner.. simplement qu'il faudra toujours copier le string si tu veux le modifier, que l'instance de la classe soit constante ou pas..
 

bien sur que les deux fonctionnes, c'est BlackGodess qui sait plus ce qu'il raconte

Reply

Marsh Posté le 11-09-2003 à 19:50:13    

lool v faire un test pour être sur qd mm :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 11-09-2003 à 19:52:48    

on doit être capable de dire si un code est bon ou pas, le compilo est un idiot

Reply

Marsh Posté le 11-09-2003 à 20:43:27    

ah ? bien :) puis-je poser des bouts de code pour avoir votre avis dessus alors ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 11-09-2003 à 20:44:43    

BlackGoddess a écrit :

ah ? bien :) puis-je poser des bouts de code pour avoir votre avis dessus alors ?


 
attention, ne laissa pas trainer tes cochoneries n'importe où  :o


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 11-09-2003 à 20:47:19    

il y a un endroit particulier pour les poster ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 11-09-2003 à 22:44:39    

Poste les en spoiler alors

Reply

Marsh Posté le 11-09-2003 à 22:49:37    

chrisbk a écrit :

Poste les en spoiler alors


 
ca veut dire quoi en spoiler ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 11-09-2003 à 22:50:49    

BlackGoddess a écrit :


 
ca veut dire quoi en spoiler ?


 

Spoiler :

c un truc pour cacher les horreurs

Reply

Marsh Posté le 13-09-2003 à 14:09:05    

Cette fois c clair, merci à tous (si, si, mm Taz) :jap:

Reply

Marsh Posté le 13-09-2003 à 15:09:35    

[:taz]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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