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 :

C++ héritage et vector iterator


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 16
    Points
    16
    Par défaut C++ héritage et vector iterator
    Bonjour,

    Il y a une notion que je ne comprends pas sur les itérators.
    J'ai une classe A ainsi qu'une class B qui hérite de A et une class C qui hérite aussi de A.

    Je crée des Objets B (donc via new B(...)) que j'ajoute dans un vector de A.

    typedef std::vector<A> a_vector; via la commande push_back. Jusque là tout est normal.

    Par contre ce que je ne comprends pas c'est que si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (unsigned int i = 0; i < a_vect->size(); i++)
    {
                 A a = a_vect[i];
    }
    Il me dit qu'il ne peut pas convertir a_vector en A.
    Là je ne comprends pas pourquoi il y arrive pas ....


    Donc du coup je passe par les itérateurs et là ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (a_vector::iterator it = a_vect->begin() ; it != a_vect->end(); it++)
    {
                 A a = *it; // ca, ca marche sans probleme
                 B* b = dynamic_cast<B*> (&a); // et la ca me donne toujours null et ca je ne comprends pas vu que je n'ai jamais fait de new A mais uniquement des new B ....
    }
    Dans le débugger le _vptr vaut bien B avant l'ajout dans le vector et mais il faut A en tant qu'itérateur. C'est comme ca le fait que je déclarait un itérateur de type A faisait que seulement la partie A de mes objets B serait visible.

    Avez-vous une idée de ce problème d'héritage ?

    Merci

    Cordialement,

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    c'est un vector de A ou de A* ?
    Le typedef indique vector<A>, ce qui interdit d'y mettre des pointeurs, et encore moins d'utiliser du polymorphisme.

    Comment est déclarer a_vect ? C'est un std::vector* ? y'a-t-il un réel intérêt ?

    a est une copie de a_vect[i], et a ne pourra jamais être transtypé vers B, il n'a aucune information sur B, ni même que B existe.

    De plus les dynamic_cast sont généralement à éviter et sont souvent révélateurs d'erreur d'interface ou architecture.
    B est-il vraiment un A ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Tu viens du monde Java Wilgard, non ?
    Comme le suggère Bousk, tu fais à plusieurs reprises des copies là où tu pensais faire des références...
    Je ne sais pas ce que désignent ces classes, mais il me semble que A ne devrait même pas être instanciable, donc avec ses constructeurs en protected.

  4. #4
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Comment as-tu déclaré a_vect ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef std::vector<A> vector_a;
     
    int f()
    {
      vector_a monVect;
       .... // remplir monVect
      A unA = monVect[0]; // OK
    }
    doit fonctionner.

    Sinon, il y a un gros problème dans ton code : si ton vecteur contient des A, il ne faut pas y mettre des B dedans : c’est trop gros, ça ne tiendra pas. Et c’est ce qu’il se passe : tes B sont convertis et copiés en A quand tu les stocke dans ton vecteur. Quand tu les récupères, ce sont des A, ce qui explique que tu ne puisses plus les convertir en B.

    Si tu veux stocker tes B dans un vecteur de A, il faut stocker en réalité des pointeurs vers des B dans un vecteur de pointeurs de A. Et plutôt que des pointeurs nus, je te conseilles d’utiliser des shared_ptr.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Je vous remercie tous les 3 pour vos réponses rapides et utiles.

    En effet cob59 je viens du monde Java , c'est sûrement pour ça que je pose des questions sur les pointeurs.

    Effectivement ma classe A est abstraite alors que B et C ne le sont pas d'où le fait que je veux mettre des B ou bien des C dans un vecteur de A.

    J'avais oublié le fait que a_vect[i] était une copie et non un récupération de référence... Merci Bousk pour cette info.

    Enfin merci white_tentacle car en effet le fait de passer par des pointeurs de B dans un vecteur de pointeurs de A fait que ca marche.

    Merci à tout les 3.

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

Discussions similaires

  1. vector : iterator.. besoins d'une petite précision
    Par italiasky dans le forum SL & STL
    Réponses: 2
    Dernier message: 18/11/2008, 10h37
  2. Réponses: 10
    Dernier message: 30/06/2008, 19h59
  3. pair, vector, iterator et type_traits
    Par NiamorH dans le forum SL & STL
    Réponses: 7
    Dernier message: 21/02/2008, 18h56
  4. Réponses: 2
    Dernier message: 07/12/2007, 02h19
  5. Template - vector - iterator
    Par jmeuf dans le forum Langage
    Réponses: 6
    Dernier message: 30/03/2007, 13h42

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