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 :

Héritage de classe


Sujet :

C++

  1. #1
    Membre éclairé Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Par défaut Héritage de classe
    Bonjour à vous cher amis de la Programmation Orienté Objet,

    J'aurais une petite question à propos de l'héritage de classe.
    J'ai été faire un petit tour sur la FAQ avant de venir poster mon message, et je me suis rendu compte de la chose suivante.

    Lorsque l'on explique l'héritage de classe, apparement on travaille toujours dans un même fichier pour mettre la classe mère et sa classe fille. Moi j'avais penser faire deux fichier séparé dans lequel se trouve d'une part la classe mère (fichier1) et d'autre part la classe fille (fichier2).

    Celà est-il possible? Si oui comment procéder? Lors de la compilation, mon makefile me signale que ma classe mère doit avoir été définie précédement. Ce qui est le cas mais dans un autre fichier. Dans mon fichier de classe fille(qui est un fichier du type *.h), j'inclus le fichier de ma classe mère (également un fichier de type *.h).

    Est ce donc le problème suivant qu'une classe mère et un classe fille doivent se trouver dans le même fichier ou mon problème viendrait-il d'autre part?

    Merci d'avance pour l'aide apportée.

    EDIT:

    Et alors, si je dois travailler dans un même fichier *.h, je devrais aussi placer toutes mes méthodes (le code propremement dit) dans le même fichier *.cxx?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Par défaut
    Salut,

    mmhh Inpres Museum hein !!!
    Non tu n'est pas obliger de mettre la class mère avec la class fille.
    Du moment que le fichier *.h de ta class PieceMuseeArt fait un #include "PieceMusee.h" il n'y a pas de problème.

    A+++

  3. #3
    Membre éclairé Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Par défaut
    HIHI,

    comme le monde est petit. Ben oui, mais lorsque je le place dans le même fichier, il me dit que mon constructeur d'initialisation n'est pas bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Badly formed expression.
    alors que j'utilise le même principe pour la construction de ma PieceMuseeArt que pour ma classe Identifiant ou PieceMusee.

    Il me dit également que ma fonction qui permet de setter les variables de ce même objet n'a pas de prototype, alors qu'il est bien déclaré dans le *.h et que le code se trouve comme pour mes autres dans le *.cxx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The function "setPieceMuseeArt" must have a prototype.
    Je sais plus quoi faire. Ca me c**** les c*******.

    enfin, je verrais bien, si d'ici le prochain cours je n'ai pas trouver, je demanderais à la prof.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Mettre tout dans un seul fichier, c'est juste pour aller plus vite pour expliquer, mais en général, on sépare bien ça un header et un fichier d'implémentation par classe.

    Comme tu ne montre pas de code, difficile de voir ce qui ne va pas dans ton cas.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 634
    Par défaut
    Salut,

    En bonne logique de programmation, il serait préférable de créer un fichier d'entete par classe (un pour la mere et un pour la fille), ainsi qu'un (ou plusieurs) fichier d'implémentation pour chacune de ces classes...

    Tu devrais donc avoir, au minimum:
    1. Le fichier d'entete de la classe mere (mere.h)
      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
       
      #ifndef CLASSE_MERE_H //"guarddog" contre l'inclusion multiple
      #define CLASSE_MERE_H
      class Mere
      {
          public:
              Mere();//constructeur par defaut
              virtual ~Mere();//destructeur de la classe
              ...
          protected:
             //les membres et méthodes disponibles dans les classes filles
          private:
             //les membres et méthodes disponible uniquement au travers de la classe
             //mere
      };
      #endif //fin ifndef CLASSE_MERE_H
    2. Le fichier d'implémentation de la classe mere (mere.cpp)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
       
      #include "mere.h" //inclusion du fichier d'entete
      Mere::Mere()//implémentation du constructeur par défaut
      {
          ...
      }
      Mere::~Mere()//implémentation du destructeur de la classe
      {
          ...
      }
      ...
    3. Le fichier d'entete de la classe fille(fille.h)
      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
       
      #ifndef CLASSE_FILLE_H //"guarddog" contre l'inclusion multiple
      #define CLASSE_FILLE_H
      #include "mere.h" //inclusion de la déclaration de la classe mere
      class Fille:public Mere
      {
          public:
              Fille();//constructeur par defaut
              virtual ~Fille();//destructeur de la classe
              ...
          protected:
             //les membres et méthodes disponibles dans les classes dérivées de Fille
          private:
             //les membres et méthodes disponible uniquement au travers de la classe
             //fille
      };
      #endif //fin ifndef CLASSE_FILLE_H
    4. Le fichier d'implémentation pour la classe fille (fille.cpp)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
       
      #include "fille.h" //inclusion du fichier d'entete
      Fille::Fille(): Mere()//implémentation du constructeur par défaut
                            //qui appelle le constructeur de la classe mere
      {
          ...
      }
      Fille::~Fille()//implémentation du destructeur de la classe
      {
          ...
      }
      ...

    Nota: Les ifndef et define devraient, selon certaines conventions etre choisi différemment...

    Je te reporte à =>ce thread<= et aux liens qu'il contient pour te faire une idée des conventions qu'il est préférable d'utiliser
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Par défaut
    Tiens, je connaissais pas cette notation CLASSE_MERE_H dans les ifndef/define/endif.
    Perso, j'ai toujours vu des truc comme MERE_H. Peut etre est-ce une question de gout, mais ma curiosité me demande qu'elle est la notation la plus proche des conventions habituelles... Va falloir que j'aille voir ça...

    PS: Désolé pour cette petite parenthèse^^

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 634
    Par défaut
    Citation Envoyé par Buendon
    Tiens, je connaissais pas cette notation CLASSE_MERE_H dans les ifndef/define/endif.
    Perso, j'ai toujours vu des truc comme MERE_H. Peut etre est-ce une question de gout, mais ma curiosité me demande qu'elle est la notation la plus proche des conventions habituelles... Va falloir que j'aille voir ça...

    PS: Désolé pour cette petite parenthèse^^
    A vrai dire, ce qui est le plus proche des conventions serait quelque chose du genre de
    cf http://emmanuel-delahaye.developpez....ganiser_source
    Ce qu'il faut, surtout, c'est veiller à ce que tu n'aie pas de risques de "telescopage" des termes utilisés...

    Dans l'absolu, ce pourrait très bien etre une convention du type de
    H_<nom classe>_<date AAAA_MM_JJ>, voir du type H_<namespace(s)>_<nom classe>...

    Bref, tout ce qui sera en mesure de t'assurer que ton define (et les ifdef/ifndef équivalents) ne puissent se rapporter qu'à une seule chose sans aucune ambiguité possible...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Par défaut
    Oki, merci bien^^

  9. #9
    Membre éclairé Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Par défaut
    Ben voilà,

    j'ai fini par trouver mon erreur. En fait j'avais oublier de placer mon objet devant la fonction membre de ma classe lors de l'appel de cette fonction.

    J'avais donc écrit
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pma1->setPieceMuseeArt(...);
    Maintenant j'ai aussi compris comment fonctionne l'héritage. M'aura fallu un petit moment, mais aurais fini par comprendre.

    Sur ce, je vous souhaite un bonne journée.

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

Discussions similaires

  1. conflit d'inclusions et Héritage de classe
    Par gedeon555 dans le forum C++
    Réponses: 7
    Dernier message: 01/10/2006, 19h48
  2. [POO] Problème héritage des classes PHP4
    Par zana74 dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2006, 16h00
  3. Héritage de classes.
    Par Berzerk_ dans le forum C++
    Réponses: 48
    Dernier message: 13/08/2006, 23h48
  4. [POO] Héritage vs classe dans une classe
    Par robichou dans le forum Langage
    Réponses: 4
    Dernier message: 06/08/2006, 23h51
  5. [OO] Héritage - Mixins Classes
    Par djmalo dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 01/03/2005, 23h16

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