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 :

Retourner une référence sur un std::vector


Sujet :

C++

  1. #1
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut Retourner une référence sur un std::vector
    Bonjour,

    J'ai une classe contenant un std::vector:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Test
    {
    public:
       std::vector<float>& GetData(void) const { return Data;}
     
    private:
       std::vector<float> Data;
    }
    auquel je souhaiterais accéder via une référence (pour éviter une recopie).
    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<float> &data = test.GetData();
    sans succès.

    Comment faire?

  2. #2
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Est-ce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<float>& GetData(void) const  { return (std::vector<float>&)m_Data;}
    vous semble correct?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    renvoie un const std::vector<float>& , c'est plus cohérent non? Sinon pourquoi mettre "const" ta méthode?

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Le problème vient effectivement du const, donc soit tu retournes une référence constante, soit tu enlèves le const de la déclaration de ta méthode.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    Citation Envoyé par bolhrak Voir le message
    Le problème vient effectivement du const, donc soit tu retournes une référence constante, soit tu enlèves le const de la déclaration de ta méthode.
    j ajouterais que tu devrais peut etre ecrire deux methodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const std::vector<float>& GetData(void) const { return Data;}
     
    std::vector<float>& GetData(void){return Data;}

  6. #6
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Ah voilà, j'avais oublié le const devant

    Merci beaucoup!

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Oublie pas le

  8. #8
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::vector<float>& GetData(void) const { return Data;}
    En fait, avant de mettre à résolu, pourriez-vous m'expliquer la notation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::vector<float>& GetData(void) const
    const std::vector<float>& permet de renvoyer une référence constante sur l'objet vecteur mais le second const signifie quoi?

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Et renvoyer une référence en non const, c'est un peu une rupture d'encapsulation. Pourquoi mettre la variable en privé alors ?

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Citation Envoyé par Rodrigue Voir le message
    const std::vector<float>& permet de renvoyer une référence constante sur l'objet vecteur mais le second const signifie quoi?


    http://cpp.developpez.com/faq/cpp/?p...S_const_member

  11. #11
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Mwouais je m'y perds un peu là ! Je ne vois pas pourquoi il faut dédoubler le mot clé const

    Le second const signifie que la fonction renvoie une variable qui ne peut pas être modifiée. Je ne vois donc pas pourquoi je dois renvoyer l'objet avec une référence constante? Est-ce que c'est parce que je spécifie au compilateur que cet objet ne peut être modifié que je dois alors lui re-spécifier qu'il doit le renvoyer sous la forme d'une référence constante (pour être sûr qu'on ne le modifie pas :hum ???

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Citation Envoyé par Rodrigue Voir le message
    Le second const signifie que la fonction renvoie une variable qui ne peut pas être modifiée.
    Non le second cnost signifie que la méthode ne modifie pas l'objet pour lequel elle est appelée. Comme tu retournes une référence sur une variable de cet objet, il faut qu'elle soit const, sinon tu pourrais la modifier et donc au final modifier l'objet sur lequel tu as appelé la méthode.

  13. #13
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Oui bolhrak c'est ce que je disais . En fait, l'un entraîne l'autre mais il faut qd même le déclarer !

    Bon, donc j'ai bien compris!

    Merci beaucoup

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/03/2007, 19h24
  2. Réponses: 2
    Dernier message: 13/12/2006, 13h39
  3. Réponses: 6
    Dernier message: 30/08/2006, 18h05
  4. Réponses: 6
    Dernier message: 28/09/2005, 11h30
  5. Comment avoir une référence sur une Vue
    Par Philippe299 dans le forum MFC
    Réponses: 1
    Dernier message: 12/08/2005, 10h03

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