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

Langage C++ Discussion :

Vector et héritage


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut Vector et héritage
    Bonjour à tous,

    J'ai un ensemble de classe qui héritent les une des autres :

    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
    Class Mere
    {
    public:
    	Mere();
    	virtual ~Mere();
     
    	void MethodeDeMere();
    }
     
    Class Fille : public Mere()
    {
    public:
    	Fille();
    	~Fille();
     
    	void MethodeDeFille();
    }
    Les différentes instances de Mereet Fillesont stockées dans un vecteur déclaré comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Mere * > datas;
    Tout celà marche bien.

    Mon problème intervient quand j'ai besoin de récupérer les données.

    Comment lors de l'itération du vecteur savoir quel est le type réel de l'objet lu afin de pouvoir récupérer les données qui lui sont propre ?
    Je recherche à faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for ( auto &d : datas ) {
        if(d == Fille)
    		d->MethodeDeFille();
    	else
    		d->MethodeDeMere();
    }
    Tester via un dynamic cast :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Fille* v = dynamic_cast<Fille*>(ptr))
    ne me parait pas possible puisque 2 classe soeurs pourraientt valider le test (Fille 2 pourrait être casté en Fille par exemple). Sans compter qu'un dynamic_cast n'est certainement pas annodin en terme de performance.

    Quelles sont mes options ?

    merci
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,

    Une simple méthode virtuelle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct Mere {
       virtual ~Mere() { }
       virtual void foo() const { std::cout << "Mere\n"; }
    };
    struct Fille: Mere {
       virtual void foo() const { std::cout << "Fille\n"; }
    };
     
    Mere *m = new Fille;
    m->foo(); // affiche "Fille"

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Salut,

    j'ai bien des méthodes virtuelles dans ma classe mère , mais là je suis dans le cas ou ma classe fille à une méthode qui lui est propre et qui n'a pas à être implémenter dans la classe mère (l'attribut qui lui est lié n'existe pas dans la classe mère).
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Ca veut dire que tu sais déjà que tu as des filles.
    Donc que tu es dans un vecteur de (pointeurs sur des) filles, et tu n'as pas de soucis.

    Pourquoi voudrais-tu manipuler des Mères commes des filles. Il y en a qui n'en sont pas du tout.

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Citation Envoyé par leternel Voir le message
    Ca veut dire que tu sais déjà que tu as des filles.
    Donc que tu es dans un vecteur de (pointeurs sur des) filles, et tu n'as pas de soucis.
    Mon vecteur contient des mères ET des filles. Au moment où j'itère sur le vecteur je ne sais pas si mon pointeur est une mère ou une fille , c'est ca que j'ai besoin de savoir.

    Pourquoi voudrais-tu manipuler des Mères commes des filles. Il y en a qui n'en sont pas du tout.
    je veux manipuler les mères comme des mère et les filles comme des filles , puisque les filles implémentes des infos supplémentaires au mère
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par grunk Voir le message
    Mon vecteur contient des mères ET des filles. Au moment où j'itère sur le vecteur je ne sais pas si mon pointeur est une mère ou une fille , c'est ca que j'ai besoin de savoir.
    Garde 2 vecteurs.

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    C'est le role des fonctions virtuelles.
    Si tu ne veux pas recourir à une fonction virtuelle, c'est qu'il y a un problème de conception.
    Ca peut venir de ce que tu as perdu l'information de typage (normal, c'est un vecteur de pointeur de mere).
    Ca peut venir de ce que tu aggreges des choses qui n'aurait pas du être ensemble, il te faut peut-être une collection de pointeurs de filles (et une pour les meres non filles)

    Une fonction virtuelle ne signifie pas que c'est la fille qui défini la fonction, mais que celle-ci peut la redéfinir.

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par grunk Voir le message
    Tester via un dynamic cast :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Fille* v = dynamic_cast<Fille*>(ptr))
    ne me parait pas possible puisque 2 classe soeurs pourraientt valider le test (Fille 2 pourrait être casté en Fille par exemple). Sans compter qu'un dynamic_cast n'est certainement pas annodin en terme de performance.
    Le dynamic_cast<>() n'est pas si couteux que cela (il est plus rapide que le InstanceOf), et ne nécessite qu'une seule instruction pour les hierachies simples.
    Si l'on prend deux classes soeurs, en aucun cas le dynamic_cast<>() ne sera valide pour les deux (le cast vers un pointeur n'est valide que pour la classe elle-même ou une des classes descendantes, ne pas confondre avec le cast d'un type vers un autre qui ne peut pas être un dynamic_cast<>().

    Le dynamic_cast<>() est donc possible et pratique, mais il signale très certainement un découpage mal pensé.
    En C++, il ne doit normalement pas y avoir de cast. Mais l'équivalent du InstanceOf() est bien le dynamic_cast<>().

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

Discussions similaires

  1. C++ héritage et vector iterator
    Par Wilgard dans le forum C++
    Réponses: 4
    Dernier message: 23/10/2012, 15h42
  2. Héritage, dynamic_cast et vector
    Par kassidy dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2010, 14h09
  3. héritage et stl::vector
    Par chollier dans le forum Débuter
    Réponses: 8
    Dernier message: 26/05/2010, 20h08
  4. Problème avec l'héritage et les vector
    Par Jayse dans le forum C++
    Réponses: 5
    Dernier message: 29/09/2008, 10h52
  5. [1.5] Vector et héritage
    Par Piolet dans le forum Langage
    Réponses: 10
    Dernier message: 14/09/2007, 14h35

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