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 :

stack : référence


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut stack : référence
    Bonjour,

    Si j'ai ceci : std::stack<A> truc;

    A chaque fois que je vais faire un push, est-ce que le constructeur de copie de "A" sera appelé ?

    Pourquoi ne puis-je pas faire ceci : std::stack<const A &> truc; ? (j'ai plein d'erreur à la compilation quand je fait ça)

    Merci d'avance...

  2. #2
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par casafa Voir le message
    Si j'ai ceci : std::stack<A> truc;

    A chaque fois que je vais faire un push, est-ce que le constructeur de copie de "A" sera appelé ?
    En attendant les références de r-valeur de la prochaine norme C++, oui.

    Citation Envoyé par casafa Voir le message
    Pourquoi ne puis-je pas faire ceci : std::stack<const A &> truc; ? (j'ai plein d'erreur à la compilation quand je fait ça)
    Il faut un type d'objet pour instancier un conteneur!

    D'ailleurs, une référence n'est pas vraiment CopyConstructible.

  3. #3
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Tu peux utiliser des pointeurs parcontre!

  4. #4
    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,

    Je me dis qu'il serait pas mal de t'aider d'abord à comprendre ce qu'est une référence.

    Contrairement aux instances d'objets et au pointeurs sur objets, une référence n'a pas d'existence propre.

    Une instance normale et un pointeur sont représentés physiquement en mémoire, et on peut donc prendre l'adresse à laquelle ils se trouvent, et connaitre le nombre de bits (ou plutôt de bytes) qui sont nécessaire pour les représenter.

    Par contre, une référence, ce n'est qu'un "alias" d'un objet existant.

    Par "alias" il faut vraiment comprendre la définition de base du terme: un autre nom pour désigner quelqu'un ou quelque chose.

    A la limite, on pourrait dire que mon alias est koala01: je ne m'appelle pas *vraiment* (pour l'état civil) koala01, mais il n'empêche que, quand on s'adresse à koala01, c'est clairement à moi que l'on s'adresse, et je réagis comme si on m'avait appelé par mon nom d'état civil.

    Par contre, koala01 n'existe que... parce que j'ai décidé d'utiliser ce terme comme alias.

    Le jour où je "disparaitrai", koala01 disparaitra avec moi ou deviendra "invalide"... Du moins, jusqu'à ce que quelqu'un d'autre décide d'utiliser koala01 comme alias.

    Une référence agit exactement comme cela: c'est parce que l'on a décidé - à un moment donné - que la référence représente un objet existant qu'elle est devenue valide, mais elle devient invalide dés que l'objet d'origine cesse d'exister tout en s'adaptant sans problème si on décide de changer l'objet d'origine auquel elle fait référence (avec la restriction que le nouvel objet d'origine doit exister).

    L'avantage de la référence, c'est qu'elle permet d'utiliser l'objet d'origine sans avoir à le copier en mémoire

    La différence entre une référence et un pointeur, c'est que le pointeur existe réellement quelque part en mémoire.

    A ce titre, un pointeur n'est jamais qu'une variable comme une autre, même si c'est une variable un peut particulière en cela que son contenu est... l'adresse mémoire à laquelle on espérera trouver l'instance réelle de l'objet recherché.

    Mais c'est cette différence qui permet de créer des conteneurs de pointeurs, et qui interdit de créer des conteneurs de références: comment remplir un conteneur avec quelque chose qui n'a pas d'existence propre

    C'est un peu comme si tu décidais de remplir une boîte de courent d'air déguisés en coups de vent

    Maintenant, c'est à toi de voir s'il est préférable de placer des instances réelles de ton objet dans la pile ou si tu préfères mettre des pointeurs sur l'objet.

    La question qu'il te faudra te poser est, principalement, de savoir si l'objet (éventuellement pointé par le pointeur) doit subsister ou non au retrait de la pile, ou si tu préfères, de savoir si la pile est responsable ou non de la création et de la destruction des objets qu'elle contient.

    Si tu envisage ta pile comme simplement une manière de gérer des éléments pré-existants - et qui continuent à exister après leur traitement en pile - dans un ordre précis, il faudra utiliser une pile de pointeurs sur tes éléments.

    Si tu envisages au contraire de créer des éléments pour les mettre directement en pile, et que ces éléments ne doivent pas continuer à exister une fois qu'ils sont sortis de la pile, tu pourras très bien préférer une piles d'éléments à une pile de pointeurs sur éléments
    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

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/08/2011, 13h19
  2. [Livres/Références] Vos avis..
    Par Community Management dans le forum Livres
    Réponses: 6
    Dernier message: 25/07/2005, 19h31
  3. Differences Stack et Heap
    Par elsargento dans le forum C++
    Réponses: 9
    Dernier message: 26/05/2004, 16h10
  4. Passage d'un tableau par référence?
    Par sebduth dans le forum C
    Réponses: 9
    Dernier message: 16/07/2003, 18h32
  5. [Concept] Table de référence
    Par matlo dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 20/01/2003, 15h01

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