Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3739 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  const string & Class::Methode()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

const string & Class::Methode()

n°511266
blackgodde​ss
vive le troll !
Posté le 09-09-2003 à 21:43:11  profilanswer
 

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 )-
mood
Publicité
Posté le 09-09-2003 à 21:43:11  profilanswer
 

n°511268
Taz
bisounours-codeur
Posté le 09-09-2003 à 21:47:56  profilanswer
 

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. }

n°511270
blackgodde​ss
vive le troll !
Posté le 09-09-2003 à 21:49:23  profilanswer
 

aaaah merci  :jap:


---------------
-( BlackGoddess )-
n°511289
blackgodde​ss
vive le troll !
Posté le 09-09-2003 à 22:14:48  profilanswer
 

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 )-
n°511299
Taz
bisounours-codeur
Posté le 09-09-2003 à 22:22:28  profilanswer
 

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

n°511302
blackgodde​ss
vive le troll !
Posté le 09-09-2003 à 22:25:10  profilanswer
 

d'accord, merci  :jap:


---------------
-( BlackGoddess )-
n°511408
Enidan
Posté le 10-09-2003 à 00:16:36  profilanswer
 

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

n°511480
blackgodde​ss
vive le troll !
Posté le 10-09-2003 à 09:30:13  profilanswer
 

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


---------------
-( BlackGoddess )-
n°511487
Taz
bisounours-codeur
Posté le 10-09-2003 à 09:38:45  profilanswer
 

ne change rien

n°511494
blackgodde​ss
vive le troll !
Posté le 10-09-2003 à 09:48:36  profilanswer
 

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 )-
mood
Publicité
Posté le 10-09-2003 à 09:48:36  profilanswer
 

n°511497
LetoII
Le dormeur doit se réveiller
Posté le 10-09-2003 à 09:49:47  profilanswer
 

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


---------------
Le Tyran
n°511499
blackgodde​ss
vive le troll !
Posté le 10-09-2003 à 09:51:10  profilanswer
 

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


---------------
-( BlackGoddess )-
n°512007
blackgodde​ss
vive le troll !
Posté le 10-09-2003 à 21:21:25  profilanswer
 

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 )-
n°512119
Enidan
Posté le 10-09-2003 à 23:53:17  profilanswer
 

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
n°512148
theShockWa​ve
I work at a firm named Koslow
Posté le 11-09-2003 à 00:44:34  profilanswer
 

Hmmm ... Ca sent le [:taz]


---------------
last.fm
n°512149
Taz
bisounours-codeur
Posté le 11-09-2003 à 00:50:46  profilanswer
 

toi t'as vraiment rien compris ...

n°512155
Taz
bisounours-codeur
Posté le 11-09-2003 à 01:40:49  profilanswer
 

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

n°512163
SoWhatIn22
Posté le 11-09-2003 à 07:57:00  profilanswer
 

Taz a écrit :

mais il est tard, alors je prends pas de pinceaux


des pincettes, pas des pinceaux

n°512168
Ashe2
Posté le 11-09-2003 à 08:15:37  profilanswer
 

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)

n°512178
Enidan
Posté le 11-09-2003 à 08:47:34  profilanswer
 

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 !

n°512186
Enidan
Posté le 11-09-2003 à 09:01:02  profilanswer
 

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 ?

n°512395
Taz
bisounours-codeur
Posté le 11-09-2003 à 13:42:05  profilanswer
 

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)

n°512728
blackgodde​ss
vive le troll !
Posté le 11-09-2003 à 18:00:53  profilanswer
 

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 )-
n°512774
Ashe2
Posté le 11-09-2003 à 18:41:58  profilanswer
 

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..

n°512779
Taz
bisounours-codeur
Posté le 11-09-2003 à 18:46:36  profilanswer
 

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

n°512800
blackgodde​ss
vive le troll !
Posté le 11-09-2003 à 19:50:13  profilanswer
 

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


---------------
-( BlackGoddess )-
n°512803
Taz
bisounours-codeur
Posté le 11-09-2003 à 19:52:48  profilanswer
 

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

n°512821
blackgodde​ss
vive le troll !
Posté le 11-09-2003 à 20:43:27  profilanswer
 

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


---------------
-( BlackGoddess )-
n°512823
schnapsman​n
Zaford Beeblefect
Posté le 11-09-2003 à 20:44:43  profilanswer
 

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!"
n°512826
blackgodde​ss
vive le troll !
Posté le 11-09-2003 à 20:47:19  profilanswer
 

il y a un endroit particulier pour les poster ?


---------------
-( BlackGoddess )-
n°512893
chrisbk
-
Posté le 11-09-2003 à 22:44:39  profilanswer
 

Poste les en spoiler alors

n°512897
blackgodde​ss
vive le troll !
Posté le 11-09-2003 à 22:49:37  profilanswer
 

chrisbk a écrit :

Poste les en spoiler alors


 
ca veut dire quoi en spoiler ?


---------------
-( BlackGoddess )-
n°512899
chrisbk
-
Posté le 11-09-2003 à 22:50:49  profilanswer
 

BlackGoddess a écrit :


 
ca veut dire quoi en spoiler ?


 

Spoiler :

c un truc pour cacher les horreurs

n°513945
Enidan
Posté le 13-09-2003 à 14:09:05  profilanswer
 

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

n°513965
Taz
bisounours-codeur
Posté le 13-09-2003 à 15:09:35  profilanswer
 

[:taz]

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  const string & Class::Methode()

 

Sujets relatifs
[Resolu] Pb avec un tableau de string en propertycomment convertit ton un string en variable Tmemo ?
lien methode post[Resolu] [C++ / thread / windows] Demarrer une methode en Thread ?
"can't find class" !!Pb dans la transformation d'un String en int..
Class en delphiconst int fct(){ return 5;}
Manipulation de string c++Equivalent de $_SERVER["QUERY_STRING"] pour les variables en POST
Plus de sujets relatifs à : const string & Class::Methode()


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)