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 :

Pointeurs sur membres d'un conteneur


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 19
    Points
    19
    Par défaut Pointeurs sur membres d'un conteneur
    Bonjour,

    J'ai utilisé un conteneur de la stl qui contient des elements d'un type de classe que j'ai défini.
    Le truc c'est que j'aimerais qu'il y ait des pointeurs qui pointent sur des elements du conteneur.

    Le soucis c'est qu'apparament les adresses changent. En effet, voici une évolution :

    0x8088360 (1)

    0x8089a90 (1)
    0x8089ab0 (2)

    0x808ba60 (1)
    0x808ba80 (2)
    0x808baa0 (3)

    Ceci avec un std::vector<A>. J'ai essayé avec un std::deque<A> ça avait l'air un peu mieux au début mais au final l'adressage change tout de même.

    Alors j'aimerais savoir si il y avait un conteneur avec des adresses fixes par hasard svp ? Ou alors une methode alternative ?
    A la base je faisais un conteneur de pointeurs (std::vector<A*>), mais j'ai cherché à faire un conteneur direct du type pour éviter les new/delete vu d'autant plus que le vecteur fait partit d'une classe elle meme, donc avantageux.

    Bref je ne sais pas si je suis clair.

    Je vous remercie.

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Salut.

    Est-ce que l'utilisation des itérateurs ne suffit pas à résoudre ton problème?

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    Ben non, moi ce qu'il me faudrait c'est qu'un pointeur à coté qui pointe sur un element de la liste n'ait pas le problème d'un changement de localisation dans la mémoire de celui ci.

  4. #4
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    std::list, std::set et std::map sont je crois les seuls conteneurs qui n'invalident pas les itérateurs au cours du temps. Les autres conteneurs peuvent le faire aussi, si tu n'utilises pas certaines opérations.

    Le changement d'adresse que tu constates vient simplement du fait que pour grandir, le vector a besoin de réallouer ses éléments ailleurs en mémoire.

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    En conclusion, avec les autres conteneurs pouvant invalider adresses et itérateurs, il faut stocker des indices.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    Ah ok j'avais lu sur le forum que seul std::vector était dans ce cas. Je voulais tester std::list mais comme il n'y avait pas la possibilité de se servir d'un indice.

    La solution à laquelle j'ai pensé cette nuit était de se servir d'un std::map et, au lieu de stocker un pointeur, stocker juste la chaine qui permettrait de retrouver le membre du conteneur.

  7. #7
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Loulou24
    std::list, std::set et std::map sont je crois les seuls conteneurs qui n'invalident pas les itérateurs au cours du temps.
    Sauf évidemment les itérateurs d'éléments qu'on a supprimé.

    Juste une question à l'OP : Pour quoi faire ?

    Souvent, quand on veut avoir des pointeurs sur A, on veut avoir un conteneur<A*> et non pas un conteneur<A>. N'est-ce pas ton cas ?
    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.

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    Non. En gros j'ai un type player, un type channel et un type client. Je veux un conteneur de players dans le channel et tout simplement un pointeur vers le player (quand il existe) dans la classe client.

    Et pour éviter de nombreux new/delete j'ai pensé qu'utiliser un conteneur<Player> plutot que conteneur<Player*> serait plus simple, car:
    - le simple retrait supprime l'element sans delete.
    - la suppression de l'instance de channel supprime tous les elements player du conteneur.
    - ça evite les try/catch.

  9. #9
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Sauf que comme ça tu t'exposes à de nombreuses copies, et Player n'est typiquement jamais une classe copiable.

  10. #10
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    Hm en effet, mais c'est pour ça que je pensais utiliser que des pointeurs pour manipuler un Player.

    Bon vous me conseillez de revenir à la technique des conteneur::<Player*> ?

  11. #11
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si Player possède une sémantique de référence, c'est la seule bonne solution (tu peux par contre ajouter un pointeur intelligent histoire de sécuriser le tout).

  12. #12
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    Comment ça une "sémantique de référence" ?

  13. #13
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Par opposition à une sémantique de valeur.

    Une classe possédant une sémantique de valeur sera copiable / affectable, et deux de ses instances seront égales si elles ont la même "valeur" (ex : les chaines, les entiers, ...), peu importe qu'il s'agisse de deux instances différentes.

    Une classe possédant une sémantique de référence ne sera pas copiable, et deux de ses instances ne seront égales que s'il s'agit du même objet en mémoire (ex : les personnages, ou encore généralement tout ce qui provient d'une hiérarchie d'héritage publique) ; donc même si tu as deux objets possédant le même "état interne", ils seront toujours différents.

    Pour retenir c'est facile : les classes posédant une sémantique de valeur se manipuleront par valeur / copie, alors que les classes possédant une sémantique de référence seront manipulées par référence / pointeur.

    C'est vraiment pas évident à expliquer comme ça, et d'ailleurs si Luc, Loïc ou Jean-Marc passe par là je suis sûr qu'il se fera un plaisir de le faire mieux que moi.

  14. #14
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    En somme c'est la meme chose que si on compare deux pointeurs sur deux objets différents mais égaux membres à membres (false) et si on compare deux objets différents egaux membres à membres (true) ?

    En tous cas je pense que je vais devoir me résigner à refaire un vecteur de pointeurs. Ce qui m'énerve c'est que j'avais utilisé cette solution mais j'avais peur de fuites de mémoires etc donc je me suis dis que ça serait plus simple. Mais finalement c'est le bordel.
    Donc je vais devoir défaire *tout* ce que j'ai fais.

  15. #15
    Membre éprouvé

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Citation Envoyé par Loulou24
    Une classe possédant une sémantique de valeur sera copiable [...]

    Une classe possédant une sémantique de valeur ne sera pas copiable [...]
    il faudra lire "sémantique de référence pour la deuxième
    Fiquet
    - FAQ SDL
    - FAQ C++

  16. #16
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    oui j'avais bien compris :)

  17. #17
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    C'est ça. Dans la sémantique de valeur, le contenu définit l'identité. On dispose de copiabilité et de comparabilité.
    Dans la sémantique de référence, l'entité définit l'identité. (En ignorant le passif cognitif et autres contextes, deux vrais jumaux ou deux clones sont bien deux entités différentes malgrè le même "contenu")


    Sinon, tu as des pointeurs intelligents pour éviter les fuites de mémoire. Ils permettent d'offrir le RAII aux objets manipulés dynamiquement.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  18. #18
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    Est-ce qu'utiliser des pointeurs intelligents est une véritable solution ou n'est-ce pas plutot une facilité qui permet de faire encore plus de conneries sans s'en rendre compte ?

  19. #19
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    C'est une solution qui permet d'avoir un code correct (en particulier résistant aux exceptions) et surtout maintenable (non truffé de try-catch toutes les 10 lignes).
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  20. #20
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    Oui alors ça c'est quelque chose d'interressant. En effet c'est chiant de devoir mettre pleins de try/catch, et en particulier l'indentation, ça parrait négligeable mais pour de grosses fonctions ça devient très vite lourd.

    Je vais me renseigner plus en profondeur sur les pointeurs intelligents (FAQ) et probablement utilsier ça.

    La question est: est-il possible/facile d'utiliser un conteneur de pointeurs intelligents ?:).

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/05/2006, 18h22
  2. Pointeur sur des fonctions membres d'une classe
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 15/02/2006, 11h35
  3. Pointeur sur fonction membre avec parametre
    Par Glosialabolas dans le forum C++
    Réponses: 7
    Dernier message: 06/02/2006, 02h32
  4. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  5. Réponses: 5
    Dernier message: 12/01/2005, 20h58

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