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 :

probleme d'heritage des attributs d'une classe à une sous classe


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 31
    Points
    31
    Par défaut probleme d'heritage des attributs d'une classe à une sous classe
    Bonjour, j'ai un probleme et je ne sais pas à quoi c'est dû c'est pour ça que je poste ici pour essayer d'avoir une explication.

    J'ai une classe Jeu avec des méthodes et des attributs, dont dans le cas qui nous interesse, un tableau d'entier à 2 dimensions :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Jeu
    {
    public:
     
    // mes méthodes
     
    protected:
     
    // les attributs ... dont :
    int m_grille[8][6]
    };

    J'ai aussi une sous classe Graphisme qui hérite de la classe Jeu :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    class Graphisme : public Jeu
    {
    public : 
     
    // mes méthodes
     
    private : 
     
    // mes attributs
     
    };

    Voilà en gros la structure de mes classes.

    Mais mon probleme c'est que mon tableau d'entier 2D change au cours du programme via des méthodes de la classe Jeu (change dans le sens où les valeurs contenues dans le tableau changent), je peux y acceder à l'exterieur de la classe grâçe à une methode get implémanté dans ma classe Jeu sans probleme, mais , et c'est là le probleme, lorsque je veux lire une case de mon tableau dans une des methodes de ma sous classe Graphisme, (un simple cout << m_grille[0][0] << endl par exemple, cela m'affiche la valeur qu'avait la case lors de l'initialisation du tableau dans le constructeur Jeu.

    Donc je ne comprend vraiment pas le principe, ma classe fille Graphisme hérite des attributs et des methodes, mais lorsque mes attributs changent dans la classe mere, elles ne sont pas "mis à jour" dans la classe fille?

    Merci de votre aide, j'espere avoir été assez clair

  2. #2
    Membre actif
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Août 2008
    Messages : 148
    Points : 232
    Points
    232
    Par défaut
    Salut,

    Je vais te poser une question qui peut paraître idiote mais sait-on jamais.
    As-tu créé une classe Jeu et une classe Graphisme pensant que Graphisme hériterait de Jeu ?

    Voilà, navré de la question si ce n'est pas cela mais je préfère écarter cette possibilité dès le départ ... d'autant que pour le moment c'est la seule que je parviens à envisager .

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 31
    Points
    31
    Par défaut
    Euh oui c'est bien ça, pourquoi, telle que je l'ai faite là, la classe Graphisme n'herite pas de Jeu? Où est le probleme?

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Si le constructeur de la classe Jeu initialise le tableau et vu que Graphisme herite de Jeu, ce comportement me semble normal.

  5. #5
    Membre actif
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Août 2008
    Messages : 148
    Points : 232
    Points
    232
    Par défaut
    Bon, alors ... il va te falloir revoir le concept de l'orienté objet.
    Dans ton cas, il te faut créer une instance de Graphisme et à ce moment là, tu peux directement accéder à l'attribut m_grille via le setter que tu auras créé.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Graphisme Graph = Graphisme();
    Graph.setGrille(/*ta grille*/);
    // J'ai mis set en guise d'exemple, utilises la méthode qui t'est propre. SetGrille étant définit dans la classe Jeu.
    Instancier une classe Graphisme et une classe Jeu signifie que tu auras une classe Jeu à disposition, et une classe Graphisme disposant de ses attributs/méthodes propres + de ceux de la classe Jeu, mais certainement pas de l'instance de Jeu que tu viens de créer.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    Citation Envoyé par gnouz Voir le message
    le probleme, lorsque je veux lire une case de mon tableau dans une des methodes de ma sous classe Graphisme, (un simple cout << m_grille[0][0] << endl par exemple, cela m'affiche la valeur qu'avait la case lors de l'initialisation du tableau dans le constructeur Jeu.
    Si ça se trouve, m_grille n'est jamais modifié.
    Est-ce qu'on peut voir les methodes set qui permettent de changer la valeur du tableau et l'order des appels ?

  7. #7
    Membre actif
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Août 2008
    Messages : 148
    Points : 232
    Points
    232
    Par défaut
    Hmm, ça voudrait dire que j'ai mal compris ... en même temps ma 1ère question était mal formulée ...
    Donc en résumé, soit tu as créé 1 instance de chaque classe et là ... il est normal que la modification de l'une n'est pas la moindre influence sur l'autre, soit ton setter ... n'est pas bon

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Un bon moyen d'éviter ce genre de trucs, c'est de rendre ta classe mère non-directement-constructible: Déclare tous ses constructeurs en protected, y compris le constructeur de copie, comme ça le compilo ne te laissera pas faire ce genre d'erreurs.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 31
    Points
    31
    Par défaut
    Oui, m_grille est vraiment modifié, j'ai une methode dans la classe Jeu qui permet d'afficher ma grille, et elle est vraiment modifié.

    Je pense aussi comme Lucien63 mais le truc c'est que même si ma classe fille herite du constructeur de Jeu, les attributs sont déclarés au depart seulement, l'appel au constructeur se fait avant que mes attributs se modifient au fur et à mesure.

    En gros, comment faire pour acceder à partir d'une methode de la classe fille à des attributs de la classe mere? Et que ma classe fille herite des attributs de la classe mere toujours, même lorsque celles çi changent dans le temps, et pas uniquement lors de leur initialisation par le contructeur

  10. #10
    Membre actif
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Août 2008
    Messages : 148
    Points : 232
    Points
    232
    Par défaut
    Ton attribut étant protected, tu peux y accéder tant que tu es à l'intérieur de la classe fille. Mais si tu tiens à créer une méthode pour y accéder, c'est la même chose, de toutes manières il sera modifié ...

    Ceci étant, tu n'as toujours pas répondu à la question ... as-tu créé une instance de la classe Jeu ? Si oui, alors ça ne peut pas fonctionner, l'instance de Jeu est totalement indépendante de l'instance de Graphisme, si non, alors post ton code parcequ'on ne pourra pas t'aider sinon ...

    Edit : Après relecture des posts ... je suis quasiment certain que tu as tout simplement créé une instance de chaque classe ... parcequ'il est impossible qu'un attribut hérité par une classe ne soit modifié que dans la classe mère ... ou alors je ne connais pas ce concept révolutionnaire ...

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En supposant que Shaidak a raison, la réponse est simple: Tu dois créer une seule instance, de type Graphisme, qui contiendra les données que tu voulais pour le jeu...

    Et comme je l'ai conseillé, rendre les constructeurs de Jeu protected...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Si c'est sur des instances différentes c'est sur que ce n'est pas normal.

    Mais ça on ne le sait pas et il faut que tu le dise pour avancer

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 31
    Points
    31
    Par défaut
    Oui je suis stupide, j'avais créer deux instances pour les deux classes, j'ai résolu le probleme en ne créant que l'instance de la classe fille (graphisme) et d'appeler toutes les methodes via cette instance et maintenant ça marche.

    je me sens bête -__-

    Merci pour toutes vos réponses

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

Discussions similaires

  1. [RegEx] Regex récuperation des attributs "clés/valeurs" d'une balise
    Par tex73 dans le forum Langage
    Réponses: 2
    Dernier message: 29/09/2013, 12h20
  2. Réponses: 2
    Dernier message: 12/06/2011, 16h04
  3. probleme de gestion des attributs en session
    Par riadhhwajdii dans le forum JSF
    Réponses: 0
    Dernier message: 21/08/2009, 12h54
  4. probleme de changement des panel au sein d'une fenetre
    Par switch1 dans le forum Composants
    Réponses: 2
    Dernier message: 04/03/2009, 13h17
  5. [VB.Net] Comment accéder à une propriété de sous-classes ?
    Par druidev dans le forum Windows Forms
    Réponses: 13
    Dernier message: 05/09/2006, 15h14

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