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 :

changement des types d'attribut hérités dans une classe fille


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut changement des types d'attribut hérités dans une classe fille
    Bonjour,
    voici mon problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class AttributsA{...};
     
    class AttributsB : AttributsA{...};
     
    class A{
    protected :
        AttributsA a;
    }
     
    class B : A{
    };
    Avec ces quatre classes, j'aimerais pouvoir faire en sorte que l'attribut a d'un
    objet de classe B deviennent de type AttributsB par défaut. Ca serait une sorte de redéfinition de l'attribut (comme on peut redéfinir des méthodes héritées).

    Est-ce possible en C++, comment faire ?

    Pour vous montrer pourquoi je me pose cette question, voici mon problème
    réel : Je tente de modéliser des graphes simples puis je dérive pour avoir des graphes avec labels (à chaque noeud est associé un label).

    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
    22
    23
    24
    25
    26
     
    class Noeuds{
        int cle;
    };
     
    class Arcs{
        pair<int,int> cle;
    };
     
     
    class Graph{
        set<Noeuds> lesNoeuds;
        set<Arcs> lesArcs;
    }
     
    class NoeudsLabel : public Noeuds{
       Label label;
    };
     
    class ArcsLabel : public Arcs{
       Label label;
    };
     
    class GraphsLabel : Graph{
       ...
    };
    Et là, comme c'est fait, mes Graph avec labels n'en sont pas puisque leurs noeuds sont toujours de classe Noeuds, je voudrais qu'ils deviennent de classe NoeudsLabel !

    Help, Merci d'avance

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Ce que tu veux n'est pas possible.

    Dans ton cas, je ferais de Noeud et Arc des arguments template de Graph après avoir regardé si la bibliothèque de graphes de boost ne fait pas ce que je veux.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 32
    Points
    32
    Par défaut
    Tu peux redéfinir les données membres aussi bien que les méthodes. Cependant les instances de la classe dérivée possèderont 2 exemplaires de la donnée redéfinie. Cela se vérifie, par exemple comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A {
         int donnee;
    };
     
    class B : public A {
         char* donnee;
    };
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::cout << sizeof(A); //Affiche 4
    std::cout << sizeof(B); //Affiche 8
    Il vaut mieux donc utiliser un système de template comme suggéré plus haut.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Ok,

    je vais faire ça avec des templates Noeud et Arc.
    C'est vrai que j'aurais pu utiliser Boost, mais n'étant pas encore familier avec
    la programmation C++, je voulais créer tout cela moi même pour me former.

    Merci pour vos réponses.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Oups, j'ai maintenant un nouveau problème :

    Ma classe Graph possède 2 paramètres template Noeud et Arcs

    Cependant, j'ai un nouveau problème qui apparaît avec cette façon de faire :

    Mes nœuds possèdent un attribut :
    set<Arcs> lesArcs
    Mes arcs possèdent deux attributs :
    Noeud noeudTete
    Noeud noeudQueue

    Donc si je mets comme pour les classes Graph,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template < class Arcs > class Noeuds{...};
    template < class Noeuds > class Arcs{...};
    Je ne pourrai pas instancier ces classes (enfin je crois) vu qu'elles ont besoin
    l'une de l'autre.
    Noeuds< Arcs< Noeuds< Arcs< ....

    Comment contourner ce nouveau problème ?

Discussions similaires

  1. Réponses: 9
    Dernier message: 12/07/2010, 14h25
  2. Attributs dynamiques dans une classe
    Par ratapapa dans le forum Langage
    Réponses: 2
    Dernier message: 16/12/2009, 17h16
  3. Réponses: 1
    Dernier message: 06/11/2009, 00h20
  4. changer l'attribut etat dans une class
    Par amen_1919 dans le forum W4 Express
    Réponses: 16
    Dernier message: 07/05/2008, 13h03
  5. changement de type pour un champ dans une table
    Par Missvan dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/02/2004, 15h26

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