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 :

Agrégation simple : pointeur ou référence ?


Sujet :

C++

  1. #1
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut Agrégation simple : pointeur ou référence ?
    Bonjour, je me pose le problème suivant :

    Soient deux classes Conteneur et Contenu. Conteneur contient Contenu dans le cadre d'une relation d'agrégation. Cependant je voudrais que Conteneur se contente d'accéder aux données de Contenu via un pointeur, ce qui éviterait d'instancier une copie coûteuse d'une instance de Contenu :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Conteneur
    {
         ...
         Contenu* contenu;
         ...
         void uneMethode()
         {
              contenu->accederAuxDonnees();
         }
    }

    Cependant, l'utilisation de pointeurs me pose problème dans le cadre de mon projet (je ne vais pas tout expliquer) et j'aimerais donc utiliser une référence. Les références sont-elles souvent utilisées dans l'industrie dans le type de cas considéré ici ? Si oui, a-t-on le même avantage que les pointeurs au niveau de la taille mémoire occupée par la référence à un objet extérieur ?

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Conteneur
    {
         ...
         Contenu& contenu;
         ...
         void uneMethode()
         {
              contenu.accederAuxDonnees();
         }
    }

    Merci d'avance pour vos réponses pour cette question basique dont je n'ai pas vraiment trouvé d'information sur le net...

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Points : 1 211
    Points
    1 211
    Par défaut
    Les références sont utilisées autant que possible. "Dans le type de cas considéré ici", je ne sais pas ce que ça veut dire (un attribut référence dans une classe, y'a rien de plus normal) mais j'imagine que la réponse est oui.
    Tu sais déjà sûrement que l'on ne peut pas réassigner une référence, qu'elle ne peut pas être nulle ou non initialisée, etc. Cela devrait t'apporter un début de réponse, par rapport à tes besoins.
    Quant à la taille de la référence, c'est complexe ... J'imagine que, déclarée dans le corps d'une structure, elle prend la forme d'un pointeur, mais c'est à vérifier. Le standard ne dit rien quand à leur représentation en mémoire, et il arrive même souvent qu'une référence ne soit même pas en mémoire (mise dans un registre du processeur, écrite "en dur" dans le code, etc.)

  3. #3
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut
    Citation Envoyé par the Hound Voir le message
    Les références sont utilisées autant que possible. "Dans le type de cas considéré ici", je ne sais pas ce que ça veut dire (un attribut référence dans une classe, y'a rien de plus normal) mais j'imagine que la réponse est oui.
    Tu sais déjà sûrement que l'on ne peut pas réassigner une référence, qu'elle ne peut pas être nulle ou non initialisée, etc. Cela devrait t'apporter un début de réponse, par rapport à tes besoins.
    Quant à la taille de la référence, c'est complexe ... J'imagine que, déclarée dans le corps d'une structure, elle prend la forme d'un pointeur, mais c'est à vérifier. Le standard ne dit rien quand à leur représentation en mémoire, et il arrive même souvent qu'une référence ne soit même pas en mémoire (mise dans un registre du processeur, écrite "en dur" dans le code, etc.)
    Bonjour the Hound,

    Merci pour cette réponse complète qui répond à toutes mes questions. Au vu de ce que tu affirmes, je pense que je vais changer tous les pointeurs membres de mes classes en références !

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ben non! Seulement là où c'est pertinent!

    Une référence est fixe, elle ne doit donc être utilisée en variable membre que pour des objets dont la durée de vie est supérieure où égale à celle de l'objet qui contient la référence, et pour lesquels l'association ne varie jamais durant la durée de vie du conteneur!

    Une autre question à te poser est: qui possède l'objet contenu? Qui gère sa durée de vie?
    Si le contenu appartient au conteneur tout au long de sa vie et possède la même durée de vie, il peut carrément être stocké par valeur dans son conteneur.
    Avec les conteneurs STL du C++11, on peut carrément construire des objets "sur place" dans un conteneur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut
    Merci ! C'est une information très utile pour moi. Je pense du coup que je n'utiliserai les pointeurs qu'au cas où l'attribut ne peut pas être initialisé dans le constructeur ou a une durée de vie inférieure à celle du conteneur.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Jimmy91 Voir le message
    Merci ! C'est une information très utile pour moi. Je pense du coup que je n'utiliserai les pointeurs qu'au cas où l'attribut ne peut pas être initialisé dans le constructeur ou a une durée de vie inférieure à celle du conteneur.
    En fait, c'est justement le contraire qu'il faut faire : si la durée de vie de l'objet contenu est plus petite ou égale à celle du conteneur (et qu'il n'y a pas de problèmes liés à la substituabilité et au polymorphisme à prendre en compte), tu as très largement intérêt à stocker les éléments contenus sous forme de valeur.

    C'est si la durée de vie des éléments contenu est plus grande que celle du conteneur (ou s'il y a des aspects liés à la substituabilité ou au polymorphisme à prendre en compte) que l'utilisation des pointeurs (intelligents) doit être envisagée
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En gros, ce que je recommande:
    • Conteneur a une durée de vie très inférieure au "contenu", et ne "possède" pas le contenu (exemple: Un lock sur un objet de synchronisation, par exemple) -> Référence
    • Contenu dont la durée de vie est directement liée à celle du conteneur (exemple: Une std::string dans un objet) -> Valeur
    • Contenu dont la durée de vie peut commencer ou finir pendant celle du conteneur -> Pointeur (de préférence intelligent)
    • Tout ce qui ne rentre pas dans un de ces moules -> Pointeur (de préférence intelligent)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut
    Merci à tous les deux pour ces réponses claires et exhaustives. Auparavant je me contentais d'utiliser des pointeurs nus sans vraiment me poser de questions. À présent le choix entre valeur, pointeur (intelligent) ou référence en C++ n'aura plus de secret pour moi !

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

Discussions similaires

  1. Transmission de pointeur par référence
    Par bertry dans le forum Débuter
    Réponses: 3
    Dernier message: 06/10/2008, 17h45
  2. Réponses: 2
    Dernier message: 15/07/2008, 16h46
  3. pointeurs et références quoi choisir ?
    Par damien77 dans le forum C++
    Réponses: 23
    Dernier message: 11/03/2008, 21h17
  4. Pointeur sur référence ?
    Par koala01 dans le forum C++
    Réponses: 24
    Dernier message: 15/01/2008, 17h54
  5. pointeur ou référence
    Par damien77 dans le forum C++
    Réponses: 2
    Dernier message: 23/03/2007, 16h43

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