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 :

Problème de référence


Sujet :

C++

  1. #1
    Membre expérimenté Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Par défaut Problème de référence
    Bonjour a tous !

    Je vous explique mon problème.
    J'ai une classe virtuel nommé Airport. Je la derive en SAirport.
    Dans mon fichier SAirport.cpp il y a l'implémentation de ma classe. Enfin le fichier main_airplaine.cpp me sert à tester ma classe.

    Voici le code :

    Classe virtuel Airport.h

    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
     
    #ifndef __AIRPORT
    #define __AIRPORT
     
    #include <string>
     
    class Airport 
    {
      public: 
        /**
         * @return The name of the airport.
         */
        virtual std::string& getName() const = 0;
    };
     
    #endif
    La classe derivée SAirport.h

    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
    26
    27
     
    #ifndef __SAIRPORT
    #define __SAIRPORT
     
     
    #include <string>
    #include "Airport.h"
     
    class SAirport : public Airport 
    {
      public: 
     
        SAirport( std::string n ) ;
     
        ~SAirport() ;
     
        /**
         * @return The name of the airport.
         */
        std::string& getName() const ;
     
      private:
     
         std::string name ;
    };
     
    #endif
    Mon fichier SAirport.cpp

    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
     
    #include <string>
    #include "SAirport.h"
     
    SAirport::SAirport( std::string n )
    {
        name = n ;
    }
     
    SAirport::~SAirport() {}
     
    std::string& SAirport::getName() const
    {
        return name ;
    }
    Le fichier main pour le test de la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include "SAirport.h"
    #include <iostream>
     
    using namespace std ;
     
    int main(void)
    {
     
       Airport* Paris = new SAirport("Paris") ;
       cout << "Nom : " << Paris->getName() << "\n" ;
       system("PAUSE" ) ;
       return 0 ;
    }
    Je code sous dev c++ version 4.9.9.2 sous windows XP sp2

    Mon problème est que le compilateur me met ceci comme erreur

    In member function `virtual std::string& SAirport::getName() const':
    ligne 13 invalid initialization of reference of type 'std::string&' from expression of type 'const std::string'
    [Build Error] ["SAirport.o"] Error 1

    Je pense que cela vient du fait que la fonction getName renvoie une référence ( car tout compile impec quand on enleve la référence ) sur une string mais je ne voi pourquoi.
    Merci d'avance de bien vouloir eclairer ma lanterne !

  2. #2
    Membre expérimenté Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Par défaut
    Bon , j'ai essayer un truc.
    Sa compile si j'enleve le const de la fonction getName et en remettant la référence.
    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::string& getName()  ;
    Je comprend pas pourquoi.
    Quelqu'un pourrait t il m'expliquer ?

    Merci d'avance !

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Tu es dans une fonction constante, donc qui promet de ne pas modifier les données membre de ta classe. Donc, vu depuis l'intérieur de cette fonction, SAirport::name est une chaîne constante.

    Tu tentes donc dans ton retour de fonction de retourner une référence vers une chaîne non constante construite à partir d'une chaîne constante, ce qui pose problème.

    Autres solutions (plus propre que d'enlever le const) :
    - Retourner une référence constante,
    - Retourner une chaîne.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre expérimenté Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Par défaut
    Tu me dit de retourner une référence constante. Donc si je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::string& SAirport::getName() const
    {
        const std::string& nom = name
        return nom ;
    }
    sa devrait marcher.
    Mais sa marche pas !

  5. #5
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const std::string& SAirport::getName() const
    {
        const std::string& nom = name;
        return nom;
    }
    Tu avais non seulement oublié le const dans le retour de la fonction, et encore un ; manquant.

    Tu peux aussi faire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const std::string& SAirport::getName() const
    {
        return name;
    }

  6. #6
    Membre expérimenté Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Par défaut
    Merci !
    Sa marche.

    Mais je voulais savoir ( pour info ) si c'était possible sans ajouter de const devant le retour de la fonction ?

  7. #7
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Ben si tu veux retourner une référence constante il n'y a aucune raison de vouloir mettre un autre type de retour, le cast const -> non const n'est pas possible du moins pas de cette manière.

  8. #8
    Membre expérimenté Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Par défaut
    Ok !
    Merci de votre aide et bonne continuation !

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

Discussions similaires

  1. [VBA-E] Problème de références
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 13/07/2006, 09h04
  2. Problème de référence de classe
    Par nmathon dans le forum Delphi
    Réponses: 7
    Dernier message: 21/06/2006, 16h46
  3. [FLASH MX2004] this et problème de référence
    Par cristolb dans le forum ActionScript 1 & ActionScript 2
    Réponses: 5
    Dernier message: 03/05/2006, 22h33
  4. Problème de référence de données circulaire
    Par Wismerhill50 dans le forum Langage
    Réponses: 3
    Dernier message: 23/10/2005, 22h38
  5. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39

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