IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Pb avec les références


Sujet :

C++

  1. #1
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut Pb avec les références
    Bonjour,

    Je bute un peu sur les références, voici un cas que je n'arrive pas
    à comprendre :
    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
    18
    19
    20
     
    void manipString(string &str)
    {  
     //......
    }
     
     
    string stringReturn()
    {
       string str = "Hello world !";
       return str;
    }
     
     
    int main()
    {
     
      manipString(stringReturn());
     
    }
    Le compilo me dit :
    error:invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string'

    error:in passing argument 1 of `void manipString(std::string&)
    En clair, est il possible de passer a une fonction qui prend en paramètre
    une référence sur string, une fonction qui retourne une string ?

    Merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    En clair, est il possible de passer a une fonction qui prend en paramètre
    une référence sur string, une fonction qui retourne une string ?
    Pas seulement, tout temporaire non nommé en général. Par contre tu peux passer un temporaire en tant que référence constante.

  3. #3
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Pas seulement, tout temporaire non nommé en général. Par contre tu peux passer un temporaire en tant que référence constante.
    heuuu... j'ai pas tout compris là.
    Qu'appel-t-on un temporaire exactement ?
    Quelle modification faudrait-il faire à mon code (un ex svp) ?

  4. #4
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Dans ton code, il faudrait que ta fonction manipString prenne une référence constante, pas une simple référence.

    C'est la condition pour pouvoir l'utiliser par référence, sinon ça voudrait dire que tu pourrais potentiellement modifier une variable temporaire, ce qui n'a souvent pas de sens.

    Exemple : manipString("bonjour"); // Ne fonctionne pas

  5. #5
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Ah ok, je crois que je commence à comprendre
    Cad que pour que mon code fonctionne tel quel, il faut
    passer à manipString une "vrai" variable string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string str = "Bonjour !";
    manipString(str);
    c'est ça ?

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    L'alternative est que manipString prenne un string const&.

  7. #7
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Oui, pourquoi est-ce que tu ne veux pas mettre string const& ?

    Tu veux pouvoir modifier ta variable ou non ?

    Si c'est non, le fait de ne pas mettre de "const" modifie quand même la sémantique de ta fonction et te fait écrire du code inutile...

  8. #8
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Tu veux pouvoir modifier ta variable ou non ?
    Oui
    pourquoi est-ce que tu ne veux pas mettre string const& ?
    C'est bon j'ai résolu mon pb
    En fait je me suis pas mal mélangé les pinceaux notamment pour éviter
    de casser l'encapsulation entre 2 classes.
    Dans mon prog, une variable membre string de la classe A doit être modifiée
    par une fonction membre de la classe B

    Pour simplifier voici un exemple sans les classes
    juste pour montrer le principe avec les références:
    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
    18
    19
    20
    21
    22
    23
    24
    25
     
    const string manipStr(const string &str) //Classe B
    {
       string modif = str;
        modif = "Bonjour le monde !";
        return modif;
    }
     
    void copyStr(const string &str) //Classe A (mutateur)
    {
        string membre_strA = str;
        cout<<membre_strA<<endl;
    }
     
    const string stringReturn() //Classe A (accesseur)
    {
       string membre_strA = "Hello world !";
       return membre_strA;
    }
     
    int main()
    {
      copyStr(manipStr(stringReturn()));
      return 0;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pdflatex, xfig et soucis avec les références aux figures
    Par DUDE007 dans le forum Mise en forme
    Réponses: 2
    Dernier message: 11/10/2011, 18h29
  2. problemes avec les références
    Par saeba357 dans le forum Langage
    Réponses: 2
    Dernier message: 14/05/2009, 14h52
  3. [Toutes versions] Problème avec les bibliothèques de référence Outlook
    Par Thierry'' dans le forum Access
    Réponses: 3
    Dernier message: 07/05/2009, 13h14
  4. Confusion avec les références
    Par vdumont dans le forum C++
    Réponses: 20
    Dernier message: 03/05/2006, 16h56
  5. Pb avec les références d'une base de données
    Par Celia1303 dans le forum Access
    Réponses: 8
    Dernier message: 01/12/2005, 15h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo