Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème d'héritage

    12 octobre 2007 à 13:43:09

    Bonjour tout le monde :)
    Voilà j'ai un problème d'héritage dans mon code : mes class filles ne reconnaissent pas l'héritage de ma class mère :(
    Du coup je me retrouve avec quelques dizaines d'erreurs vu que tous les attributs que j'utilise dans mes class filles venant de ma class mère ne sont pas reconnus. ^^
    Donc voilà le code de ma class mère et de mes 2 class filles.
    Si quelqu'un à la patience de les lire et donc d'essayer de trouver l'erreur :)
    Je précise que j'ai regroupé tout mes attributs dans ma class mère afin que mes class filles puissent avoir accès à ceux-là. ^^

    Merci d'avance.

    ObjetTerrain.h //Class mère
    1. #ifndef ObjetTerrain
    2. #define ObjetTerrain
    3. #include <stdlib.h>
    4. #include <stdio.h>
    5. #include <SDL/SDL.h>
    6. #include "Personnage.h"
    7. #include <SDL/SDL_image.h>
    8. #include <FMOD/FMOD.h>
    9. #include <iostream>
    10. #include <string>
    11. #include "Terrain.h"
    12. #include "main.h"
    13. class ObjetTerrain
    14. {
    15. protected :
    16.         //Attributs de terrain
    17.    int tailleH;
    18.          int tailleL;
    19.          int couleurA;
    20.          int couleurB;
    21.         int couleurC;
    22.   SDL_Surface *surface;
    23.   //Attributs de Personnage
    24.         std::string image;
    25.     SDL_Rect position;
    26.     SDL_Surface *S_Perso;
    27. };
    28. #endif


    Terrain.h //class fille
    1. #ifndef Terrain
    2. #define Terrain
    3. #include <stdlib.h>
    4. #include <stdio.h>
    5. #include <SDL/SDL.h>
    6. #include <SDL/SDL_image.h>
    7. #include <FMOD/FMOD.h>
    8. #include <iostream>
    9. #include <string>
    10. #include "ObjetTerrain.h"
    11. class Terrain : public ObjetTerrain
    12. {
    13.     public:
    14.                 Terrain(); //Constructeur
    15.                 void creation();
    16.                 void refresh();
    17.             SDL_Surface* getSurface();
    18.                 int getColorA() const;
    19.                 int getColorB() const;
    20.                 int getColorC() const;
    21. };
    22. #endif


    Personnage.h //Class fille
    1. #ifndef Personnage
    2. #define Personnage
    3. #include <stdlib.h>
    4. #include <stdio.h>
    5. #include <SDL/SDL.h>
    6. #include <SDL/SDL_image.h>
    7. #include <FMOD/FMOD.h>
    8. #include <iostream>
    9. #include <string>
    10. #include "Terrain.h"
    11. #include "ObjetTerrain.h"
    12. class Personnage : public ObjetTerrain
    13. {
    14.     public:
    15.                 Personnage(); //Constructeur
    16.                 void afficher();
    17.                 void bouger();
    18.                 void click();
    19.             SDL_Surface* getSurfacique();
    20.                 int getPositionX();
    21.                 int getPositionY();
    22.                 SDL_Rect getPosition() const;
    23. };
    24. #endif
    • Partager sur Facebook
    • Partager sur Twitter
      12 octobre 2007 à 14:52:33

      Quelle est l'erreur exactement ?
      J'ai survolé rapidement le code, et je n'ai rien vu d'erroné...

      Et les .cpp ?
      • Partager sur Facebook
      • Partager sur Twitter
        12 octobre 2007 à 15:28:17

        J'ai presque une ceintaines d'erreurs qui me dise plus ou moins toute que les attributs indiqués sont introuvables ^^
        Les .cpp sont assez longs.. puis avant de faire ce système d'héritage ils marchaient très bien cependant j'ai rien changé de spécial dans ceux-là quand j'ai fait hérité les class de ces méthodes à une fonction mère.
        Dans les méthodes, j'utilise les attributs comme s'ils étaient directement dans ma class.
        Ne faut-il pas faire comme ça ? :)

        // Un exemple d'une méthode de Personnage.cpp

        1. // récupérer la position
        2. int Personnage::getPositionX()
        3. {
        4.     return position.x ;
        5. }


        Ici, on me dit que "position" est introuvable :(
        • Partager sur Facebook
        • Partager sur Twitter
          12 octobre 2007 à 15:44:53

          Quand tu compiles tu compiles bien les 3 fichiers ensemble?
          A savoir classe mere + classes filles? (les cpp uniquement).
          Essaye avec ca, une piste au cas ou ...
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            12 octobre 2007 à 18:15:03

            Bonjour.
            Je ne comprends pas vraiment comment tu procèdes, ou plutôt je ne comprends pas pourquoi tu fais comme ça...
            Si des attributs de ta classe mère n'ont rien voir avec ta classe fille, il y a un problème de conception. Je dis ça car je vois "//Attributs de Personnage". Si tous ces attributs destinés à la classe Personnage ne sont pas utilisé par la classe Terrain tu vas bouffer la mémoire plus vite que ma chatte ne mange ses croquettes (pour ceux qui ne la connaisse pas, c'est une boulimique :( ).
            Ensuite je n'ai pas vraiment expérimenté le fait d'utiliser les attributs de la classe mère dans une classe fille, mais mon idée est qu'ils ne sont pas accessible comme ça.

            Tu devrais revoir ton algorithme à mon avis. Personnellement j'aurais créé une classe mère "ObjetBasique" qui aurait contenu les attributs communs à tous les objets "non-basiques". Avec un constructeur et toussa.
            Dans les classes filles j'aurais ajouté les attributs qui leurs sont propres. Dans leurs constructeur j'aurais appelé le constructeur de la classe mère avec des arguments qui sont propres aux différentes classe filles.

            Bonne continuation. ;)
            • Partager sur Facebook
            • Partager sur Twitter
              12 octobre 2007 à 18:28:21

              Je pense moi aussi qu'il y a un problème de conception.

              En regardant les includes, j'y ai vu des erreurs.
              La classe mère "ObjetTerrain" possède
              #include "Terrain.h"

              Ca ne devrait pas être le cas:
              1) car c'est la classe mère, elle n'a pas besoin des classes filles
              2) ça risque de créer des boucles d'include, qui peuvent générer des problèmes (les même que tu as actuellement d'ailleurs :p)

              De même, dans "Personnage.h" enlève l'include
              #include "Terrain.h"
              • Partager sur Facebook
              • Partager sur Twitter
                12 octobre 2007 à 18:39:35

                pour accéder aux attributs de la classe mère on utilise l'operateur de portée "::"
                "Classe_Mere::Attribut"
                • Partager sur Facebook
                • Partager sur Twitter
                  12 octobre 2007 à 19:56:12

                  Merci pour vos réponses ^^
                  Mais.. ça ne résout hélàs pas mon problème, les erreurs sont toujours là :(
                  Pour répondre à Chlab_lak, j'ai essayé avec l'opérateur de portée mais ça ne marche tout de même pas j'ai exactement les mêmes erreurs. (Sinon j'aime beaucoup ton image de Pein :D )
                  Sinon oui Sebajuste tu as raison j'avais des includes inutiles mais le système des ifndef, define et endif devrai me protéger de ça normalement non ?
                  Et hiura j'ai mis tout mes attributs dans ObjetTerrain sans beaucoup réfléchir à ceux que je ne partagé pas mais même en rectifiant ceux là j'ai quand même besoin de certains attributs que je me sert pour implémenter des méthodes dans "Personnage.cpp" et "Terrain.cpp" :)
                  Ben je pense oui que je compile tout mes fichiers ensembles enfin c'est Visual qui s'en charge je pense :D Sinon je ne saurai comment faire pour te le dire..

                  Je viens de regarder plusieurs cours et je ne repérer mon erreur dans aucun d'eux..
                  Si quelqu'un donc saurai voir une erreur dans ceci. Je peux si besoin donner tout de même les .cpp :)

                  Je remercie d'avance les personnes voulant bien s'y pencher dessus.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    12 octobre 2007 à 20:20:21

                    Citation : Sebajuste

                    Quelle est l'erreur exactement ?

                    +1

                    Citation : Jackie

                    Et hiura j'ai mis tout mes attributs dans ObjetTerrain sans beaucoup réfléchir à ceux que je ne partagé pas mais même en rectifiant ceux là j'ai quand même besoin de certains attributs que je me sert pour implémenter des méthodes dans "Personnage.cpp" et "Terrain.cpp" :)

                    Donc des attributs communs à Personnage et Terrain ?
                    En créant des axesseurs (ortho?) pour les attributs de ta classe mère ça change qqch?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 octobre 2007 à 20:21:14

                      Citation : Jackie

                      mais le système des ifndef, define et endif devrai me protéger de ça normalement non ?


                      Normalement oui. Enfin c'est ce que je croyais.
                      Car en réalité non...

                      Il m'est arrivé exactement le même problème. Des attributs dont le type n'était pas trouvé.

                      A qui la faute ? A ces appels d'include. La page A qui appelle la page B; et la page B qui appelle la page A.
                      Dès qu'il y en a trop, impossible à compiler !

                      Je n'ai rien trouvé comme solution, à part mieux revoir mon architecture. Et je crois que c'est la seule solution.

                      Les #ifndef sont avant tout là pour éviter les problèmes quand plusieurs fichier d'entête on besoin du même .h
                      Ce n'est pas une solution aux appels récursifs.
                      Enfin je crois...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 octobre 2007 à 20:21:15

                        tu as bien fais comme ca ?
                        1. // récupérer la position
                        2. Sint16 Personnage::getPositionX(void)
                        3. {
                        4.     return ObjetTerrain::position.x;
                        5. }

                        sinon as-tu appelé le constructeur de ta classe mère ?

                        edit: donne-nous quelques erreurs. les plus courantes que tu as
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          12 octobre 2007 à 20:25:50

                          Citation : Sebajuste

                          Citation : Jackie

                          mais le système des ifndef, define et endif devrai me protéger de ça normalement non ?


                          Normalement oui. Enfin c'est ce que je croyais.
                          Car en réalité non...

                          Il m'est arrivé exactement le même problème. Des attributs dont le type n'était pas trouvé.

                          A qui la faute ? A ces appels d'include. La page A qui appelle la page B; et la page B qui appelle la page A.
                          Dès qu'il y en a trop, impossible à compiler !

                          Je n'ai rien trouvé comme solution, à part mieux revoir mon architecture. Et je crois que c'est la seule solution.

                          Les #ifndef sont avant tout là pour éviter les problèmes quand plusieurs fichier d'entête on besoin du même .h
                          Ce n'est pas une solution aux appels récursifs.
                          Enfin je crois...

                          C?est nouveaux alors. :-°
                          Tu as surement du faire un copié collé que tu as mal modifié ou une faute de frappe, mais en tout cas je n'ai jamais eut de problème avec ça et des includes "en boucle" j'en fais très souvent.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 octobre 2007 à 21:13:03

                            Sauf que je ne fais plus de copié/collé depuis bien longtemps :p

                            Et si ! Il y a un problème avec les includes.
                            Tu l'as même sous les yeux ^^

                            Bon, après une petite recherche, voilà la solution:
                            http://cpp.developpez.com/faq/cpp/?page=classes#CLASS_reference_croisee

                            Cependant, je pense qu'une bonne architecture qui évite ce genre de problème est préférable à cette solution.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            problème d'héritage

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown