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

SL & STL C++ Discussion :

vector polymorphique de pointeurs sur animaux


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Par défaut vector polymorphique de pointeurs sur animaux
    bonjour,

    j'ai un petit souci, je veux créer un vector d'animaux ( Faune.h) qui hérite de la classe vector pour le moment j'ai fait un truc dans ce gout là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #ifndef FAUNE
    #define FAUNE
    #include "./animal.h"
    #include <vector>
    using namespace std;
     
     
    typedef vector<animal*> VecAnim; 
     
    class Faune:public VecAnim{
     public:
     
      Faune():VecAnim(){}
      ~Faune(){this->clear();}
      void add_animal(animal *a){
        push_back(a);
      }
     
    };
     
    #endif
    Dans mon main(), ça ca passe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Faune f;
     
    lapin l;
    lapin * pLap =&l;
    f.add_animal(pLap); 
    f[0]->try_manger();
    mais pas quand je fais un new :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f[0]=new lapin();
    f[0]->try_manger();
    la compilation est ok mais j'ai une erreur de segmentation !

    si quelqu'un peut me renseigner, je viens de commencer l'objet et je maitrise pas trop !

    merci d'avance !!!!

    porco

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f[0]=new lapin();
    f[0]->try_manger();
    Ton tableau n'est pas correctement alloué, contrairement au cas précédent où tu utilises add_animal.

    A part ça, dériver publiquement de std::vector n'est pas conseillé (voir discussions sur ce forum), surtout que ce n'est pas nécessaire dans ton cas.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Par défaut
    En fait à la base mon prof veut q'on fasse une spécialisation donc un héritage privé de la classe vector ( mais je voulais me servir de l'opérateur [] de la class vector, dc je l'ai fait public), c'est pas spécialement nécéssaire mais pour le conceptuel "c'est propre" comme il dit ! alors va savoir.

    quand tu dis que mon tableau n'est pas aloué correctement, t'aurais une solution
    parce qu'en fait je vois pas exactement ce qui cloche, c'est le new qu'il aime pas , ou peut être l'affectation qui se fait pas correctement! bref je sais pas trop!

    merci d'avance pour ta réponse

    porco

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    En fait à la base mon prof veut q'on fasse une spécialisation donc un héritage privé de la classe vector ( mais je voulais me servir de l'opérateur [] de la class vector, dc je l'ai fait public), c'est pas spécialement nécéssaire mais pour le conceptuel "c'est propre" comme il dit ! alors va savoir.
    La différence entre héritage publique et privé n'est pas de rendre ou non accessible les fonctions membres de la classe de base, cela a une importance toute autre au niveau conception. Un héritage privé sera en fait équivalent à une aggrégation (ie. avoir le vector en donnée membre), ce qui n'a donc rien à voir avec un héritage publique.
    Je ne suis donc pas sûr que cela une bonne idée de rendre cet héritage publique "juste pour utiliser l'opérateur []" (chose qui peut d'ailleurs se faire facilement avec la directive "using" si tu ne veux pas réécrire la fonction)

    quand tu dis que mon tableau n'est pas aloué correctement, t'aurais une solution
    parce qu'en fait je vois pas exactement ce qui cloche, c'est le new qu'il aime pas , ou peut être l'affectation qui se fait pas correctement! bref je sais pas trop!
    Au moment où tu utilises f[0], f n'est pas alloué, il n'y a donc pas d'élément 0. Il faut donc utiliser push_back (via add_animal par exemple), qui va lui redimensionner le tableau s'il n'est pas assez grand. Tu peux aussi utiliser resize.

  5. #5
    Membre chevronné
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Par défaut
    Citation Envoyé par porco
    quand tu dis que mon tableau n'est pas aloué correctement, t'aurais une solution
    parce qu'en fait je vois pas exactement ce qui cloche, c'est le new qu'il aime pas , ou peut être l'affectation qui se fait pas correctement! bref je sais pas trop!
    Tu as fait le choix d'utiliser un vector pour stoquer tes animaux, mais l'utilisation n'est pas plus magique que celle d'un tableau dynamique ordinaire: si tu veux stoquer des choses dans ton vector, tu dois lui allouer de la mémoire.
    Ta fonction add_animal s'en charge grace à push_back (hérité de vector)

    Proposition: surcharger [], faire un test sur l'indice passé pour vérifier s'il est supérieur à size(), si oui, faire un resize(indice)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Par défaut
    merci à vous c'est vrai qu'il n'y a rien de magique il faut tout de même allouer de la place avant d'y mettre quelque chose, jme suis tellement focalisé sur l'erreur que j'en ai oublié les base bref j'ai opter pour la surchage de [] ( comme ça le resize est fait quand il faut ) ainsi l'héritage de vector peu rester privé.

    merci à vous , surtout pour la rapidité de réponse, certainement à une prochaine
    porco

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

Discussions similaires

  1. pointeur sur un vector de template
    Par Shibron dans le forum Langage
    Réponses: 5
    Dernier message: 29/04/2011, 15h33
  2. Réponses: 21
    Dernier message: 03/06/2010, 18h26
  3. suppression d'un pointeur sur un objet dans un vector
    Par Mindiell dans le forum SL & STL
    Réponses: 9
    Dernier message: 07/08/2008, 14h42
  4. [c++] pointeur sur vector
    Par agrosjea dans le forum SL & STL
    Réponses: 3
    Dernier message: 28/03/2007, 18h37
  5. vector de pointeurs sur des objet
    Par jean-bobby dans le forum SL & STL
    Réponses: 26
    Dernier message: 06/08/2004, 14h54

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