agrégation et héritage en C++
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 31

agrégation et héritage en C++



  1. #1
    invitefe3b1365

    agrégation et héritage en C++


    ------

    bonjour,
    J'ai un exercice à faire avec un diagramme avec agrégation et héritage :
    diagramme.jpg

    question : Déclarez la définition des classes CAutomobile, CMoteur, CMoteurEssence dans un fichier d’entête personnalisé. Écrivez dans un fichier .cpp propre à chaque classe, son constructeur et sa méthode Afficher( ).

    mon codage :
    FICHIERS .h

    Code:
    /**
     * @(#) CAutomobile.h
     */
    
    #ifndef CAUTOMOBILE_H_H
    #define CAUTOMOBILE_H_H
    
    #include <iostream>
    #include <string>
    #include "CMoteur.h"
    
    using namespace std;
    
    class CMoteur;
    
    class CAutomobile
    {
    private:
            int Prix;
            string Couleur;
            string NumImmatriculation;
    
            CMoteur * LeMoteur;
    
    public:
            CAutomobile( );
            CAutomobile(int Px, string Coul, string Immat, int PD, string NS);
            ~CAutomobile( );
    
            void Avancer( );
            void Reculer( );
            void Afficher( );
    
    };
    
    #endif

    Code:
    /**
     * @(#) CMoteur.h
     */
    
    #ifndef CMOTEUR_H_H
    #define CMOTEUR_H_H
    
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class CMoteur
    {
    protected:
            int PuissanceDynamique;
            string NumSerie;
    
    public:
            CMoteur( );
            CMoteur(int PD, string NS);
            ~CMoteur( );
    
            bool Demarrer( );
            bool Arreter( );
            void Afficher( );
    };
    
    #endif

    Code:
    /**
     * @(#) CMoteurEssence.h
     */
    
    #ifndef CMOTEURESSENCE_H_H
    #define CMOTEURESSENCE_H_H
    
    #include <iostream>
    #include <string>
    #include "CMoteur.h"
    
    using namespace std;
    
    class CMoteurEssence: CMoteur
    {
    private:
            int VolumeReservoir;
            int NbreSoupape;
            
    public:
            CMoteurEssence( );
            CMoteurEssence(int, string, int, int);
            ~CMoteurEssence( );
    
            void VidangerHuileMoteur( );
            void Afficher( );
            
    };
    
    #endif
    FICHIERS .cpp

    Code:
    /**
     * @(#) CAutomobile.cpp
     */
    
    
    #include "CAutomobile.h"
    #include "CMoteur.h"
           
    CAutomobile::CAutomobile( )
    {
            this->LeMoteur = NULL;
    }
    
    CAutomobile::CAutomobile(int Px,string Coul,string Immat, int PD, string NS)
    {
            Prix=Px;
            Couleur=Coul;
            NumImmatriculation=Immat;
            LeMoteur=newMoteur(PD,NS);
    }
    
    CAutomobile::~CAutomobile( )
    {
    }        
    
    void CAutomobile::Avancer( )
    {
          cout<<"L automobile avance"<<endl;  
          LeMoteur.Avancer( );             
    }
    
    void CAutomobile::Reculer( )
    {
          cout<<"L automobile recule"<<endl; 
          LeMoteur.Reculer( );              
    }
    
    void CAutomobile::Afficher( )
    {
            cout<<"Caracteristiques de l automobile :"<<endl;
            cout<<"Prix : "<<Prix<<endl;
            cout<<"Couleur : "<<endl;
            cout<<"Numero d immatriculation :"                                                                                                                                                                                                        
                                          <<NumImmatriculation<<endl;
          LeMoteur.Afficher( );
    
    }

    Code:
    /**
     * @(#) CMoteur.cpp
     */
    
    
    #include "CMoteur.h"
    
    CMoteur::CMoteur( )
    {
         PuissanceDynamique = 0;
         NumSerie = "00000000";
    }
    
    CMoteur::CMoteur(int PD, string NS)
    {
         PuissanceDynamique = PD;
         NumSerie = NS;
    }
    
    ~CMoteur::CMoteur( )
    {
    }
    
    
    boolean CMoteur::Demarrer( )
    {
          cout<<"Le moteur demarre"<<endl;       
    }
    
    boolean CMoteur::Arreter( )
    {
          cout<<"Le moteur s arrete"<<endl;       
    }
    
    void CMoteur::Afficher( )
    {
          cout<<"Les caracteristiques du moteur sont : "<<endl;   
          cout<<"Puissance dynamique : " PuissanceDynamique<<endl;
          cout<<"Numero de serie : " NumSerie<<endl;    
            
    }

    Code:
    /**
     * @(#) CMoteurEssence.cpp
     */
    
    
    #include "CMoteurEssence.h"
    
    CMoteurEssence::CmoteurEssence(int VR, int NbS, int PD, string NS):CMoteur(PD,NS)
    {
           VolumeReservoir=VR;
           NbreSoupape=NbS;
    }
    
    CMoteurEssence::CmoteurEssence( )
    {
    }
    
    CMoteurEssence::~CmoteurEssence( )
    {
    }
    
    void CMoteurEssence::VidangerHuileMoteur( )
    {
            count<<"Vidanger l huile moteur"<<endl;       
    }
    
    void CMoteurEssence::Afficher( )
    {
            count<<Les caracteristiques du moteur essence sont :"<<endl;
            count<<"Volume du reservoir : "<<VolumeReservoir<<endl;
            count<<"Nombre de soupapes : "<<NbreSoupape<<endl;
           
    }
    Et la question suivante est :

    Complétez la fonction principale suivante afin d’afficher les caractéristiques d’un objet MonAuto:
    --Prix: 11500
    --Couleur: Blanche
    --NumImmatriculation: CR-340-AB
    --de moteur: MonMoteurà
    main()
    {
    CMoteur MonMoteur(110, «31AB47K») ;
    CAutomobile MonAuto(…………..) ; // A compléter
    ……….. // A compléter
    }
    Testez votre programme.

    J'ai écrit :
    Code:
    #include <iostream>
    #include <string>
    #include "CAutomobile.h"
    #include "CMoteur.h"
    #include "CMoteurEssence.h"
    
    using namespace std;
    
    int main()
    {
        CMoteur MonMoteur(110,"31AB47K");
        CAutomobile MonAuto(11500,"Blanche","CR-340-AB",MonMoteur&);
    
        MonAuto.Afficher( );
        MonMoteur.Afficher( );
    
        return 0;
    }

    Et c'est là que ça coince..... je suis sur une erreur que je ne trouve pas depuis 2 jours !
    Code::blocks me donne l'erreur suivante :code blocks.jpg

    Si quelqu'un peut m'aider.....je débute (je ne programme que depuis le mois de décembre )
    ..........

    Et quelques pistes pour la question suivante seraient les bienvenues.....

    Le monde de l’électrique dans le secteur automobile étant pour l’instant très succinct, j’opte pour une motorisation de type « Essence ».
    Un objet NouvelAuto de caractéristiques :
    -Prix: 11500
    -Couleur: Blanche
    -NumImmatriculation: CR-340-AB
    Moteur essence: CMoteurEssence *NouveauMoteur ;
    PuissanceDynamique: 175
    NumSerie: 68FH222S
    VolumeReservoir: 60
    NbreSoupape: 4
    Codez puis testez votre programme nouveau programme afin d’afficher les caractéristiques ci-dessus.

    Un grand merci à ceux qui me viendront en aide !

    -----

  2. #2
    invite5c4e9cf8

    Re : agrégation et héritage en C++

    Dans mes souvenirs du c++, le passage par référence d'une variable s'écrit &a et non pas a&, ce qui expliquerait cette erreur de parsing. Mais même en corrigeant cela, je ne vois pas de constructeur qui corresponde à la ligne 12 dans la classe CAutomobile, apparemment tu construis une instance de CAutomobile sans utiliser une instance de CMoteur, tu construis une instance de CMoteur dans le constructeur de CAutomobile à partir des arguments int PD et string NS, donc il te faut créer un constructeur du type : CAutomobile(int Px, string Coul, string Immat, CMoteur& moteur) si tu veux que ton code à la ligne 12 fonctionne.

  3. #3
    jacknicklaus

    Re : agrégation et héritage en C++

    Tu définis comme constructeur :
    Code:
    CAutomobile::CAutomobile(int Px,string Coul,string Immat, int PD, string NS)
    et tu l'utilises selon :
    Code:
    CAutomobile MonAuto(11500,"Blanche","CR-340-AB",MonMoteur&);
    ca ne correspond pas !
    There are more things in heaven and earth, Horatio, Than are dreamt of in your philosophy.

  4. #4
    pm42

    Re : agrégation et héritage en C++

    Citation Envoyé par jacknicklaus Voir le message
    ca ne correspond pas !
    En effet et comme dit par informateurYoutube, le & après une variable est une erreur de syntaxe.
    D'autant que vu que le code ne contient ni références ni pointeurs, on se demande ce qu'il vient faire.

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : agrégation et héritage en C++

    Dans mes souvenirs du c++, le passage par référence d'une variable s'écrit &a
    Si le & précède une variable de la liste des paramètres lors de l'appel de la fonction, il s'agit plutôt un passage par adresse.

  7. #6
    invitefe3b1365

    Re : agrégation et héritage en C++

    bonjour,
    merci de me répondre aussi rapidement...
    J'ai modifié le constructeur, essayé de mettre le & devant ou derrière, l'erreur est la même.... (j'avais déjà essayé mais ça n'avait rien donné)

  8. #7
    Jack
    Modérateur

    Re : agrégation et héritage en C++

    Mais pourquoi vouloir absolument mettre ce &?
    le constructeur attend une string dans le dernier paramètre, donne lui une string.

    J'ai modifié le constructeur
    On peut voir le code et le message d'erreur?
    Dernière modification par Jack ; 11/05/2017 à 10h17.

  9. #8
    invite0bbe92c0

    Re : agrégation et héritage en C++

    Bonjour

    Y'a un problème de case :

    Code:
    CMoteurEssence::CmoteurEssence

  10. #9
    invitefe3b1365

    Re : agrégation et héritage en C++

    oups merci !

  11. #10
    invitefe3b1365

    Re : agrégation et héritage en C++

    j'ai essayé les 2 versions et ça donne :
    erreur2.jpg
    ou
    erreur.jpg

  12. #11
    pm42

    Re : agrégation et héritage en C++

    Il faut que tu fasses plus attention. Dans ta 1ère version, tu mets &CMoteur.
    Comme déjà dit plusieurs fois, ton & ne sert à rien nulle part dans ton code et tu le mets quand même.
    Ensuite, CMoteur est le nom de ta classe, pas de ta variable donc cela ne veut rien dire.

    Pour l'autre cas, tu passes des tableaux de char quand ta méthode attend des string...
    Dernière modification par pm42 ; 11/05/2017 à 11h21.

  13. #12
    invitefe3b1365

    Re : agrégation et héritage en C++

    ça c'était ma première version :
    Nom : erreur 3.jpg
Affichages : 404
Taille : 60,0 Ko

  14. #13
    invite1c6b0acc

    Re : agrégation et héritage en C++

    Il est surprenant que tu n'aies pas d'erreur, à la compilation de CMoteur.cpp à la ligne :
    Code:
    ~CMoteur::CMoteur( )
    puisque la syntaxe est incorrecte.
    Ça devrait être
    Code:
    CMoteur::~CMoteur( )
    Comme d'autre part ta liste d'erreur dit que tu n'as pas défini, par exemple, la méthode CMoteur::CMoteur(int, string) alors qu'elle figure dans CMoteur.cpp, logiquement ça veut dire que CMoteur.cpp ne fait pas partie de ton projet.

    Pour les autres, je n'ai pas tout regardé, mais effectivement, tu ne définis nulle part
    CAutomobile::CAutomobile (int,String,String,CMoteur&).

    Par contre, il est surprenant que tu n'aie pas d'erreur à la compilation (tes erreurs sont à l'édition de liens) puisque tu ne la déclare pas non plus.

    A ta place, je vérifierais que mes sources sont tous inclus correctement dans mon projet.

  15. #14
    jacknicklaus

    Re : agrégation et héritage en C++

    Comment veux tu qu'on te réponde ?
    Tu dis avoir modifié le constructeur, on t'a déjà demandé de nous donner le nouveau code, et on attends toujours.
    Et manque de bol, ma boule de cristal est en révision, je ne peux pas voir tes .h à distance.
    There are more things in heaven and earth, Horatio, Than are dreamt of in your philosophy.

  16. #15
    invitefe3b1365

    Re : agrégation et héritage en C++

    effectivement, j'ai inclus les sources et j'ai plein d'erreurs....
    j'en corrige avant de poster ce qui me pose problème...
    merci

  17. #16
    invitefe3b1365

    Re : agrégation et héritage en C++

    voilà tous mes sources :
    Code:
    /**
     * @(#) CAutomobile.h
     */
    
    #ifndef CAUTOMOBILE_H_H
    #define CAUTOMOBILE_H_H
    
    #include <iostream>
    #include <string>
    #include "CMoteur.h"
    
    using namespace std;
    
    
    
    class CMoteur;
    
    class CAutomobile
    {
    private:
            int Prix;
            string Couleur;
            string NumImmatriculation;
    
            CMoteur * LeMoteur;
    
    public:
            CAutomobile( );
            CAutomobile(int Px, string Coul, string Immat, CMoteur& Moteur);
            ~CAutomobile( );
    
            void Avancer( );
            void Reculer( );
            void Afficher( );
    
    };
    
    #endif
    Code:
    /**
     * @(#) CAutomobile.cpp
     */
    
    #include <iostream>
    #include <string>
    #include "CAutomobile.h"
    #include "CMoteur.h"
    using namespace std;
    
    CAutomobile::CAutomobile( )
    {
            this->LeMoteur = NULL;
    }
    
    CAutomobile::CAutomobile (int Px,string Coul,string Immat,CMoteur&)
    {
            Prix=Px;
            Couleur=Coul;
            NumImmatriculation=Immat;
            LeMoteur=new Moteur(PD,NS);
    }
    
    CAutomobile::~CAutomobile( )
    {
    }
    
    void CAutomobile::Avancer( )
    {
          cout<<"L automobile avance"<<endl;
          LeMoteur.Avancer( );
    }
    
    void CAutomobile::Reculer( )
    {
          cout<<"L automobile recule"<<endl;
          LeMoteur.Reculer( );
    }
    
    void CAutomobile::Afficher( )
    {
          cout<<"Caracteristiques de l automobile :"<<endl;
          cout<<"Prix : "<<Prix<<endl;
          cout<<"Couleur : "<<Couleur<<endl;
          cout<<"Numero d immatriculation :"<<NumImmatriculation<<endl;
          LeMoteur.Afficher( );
    
    }

    Code:
    /**
     * @(#) CMoteur.h
     */
    
    #ifndef CMOTEUR_H_H
    #define CMOTEUR_H_H
    
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class CMoteur
    {
    protected:
            int PuissanceDynamique;
            string NumSerie;
    
    public:
            CMoteur( );
            CMoteur(int PD, string NS);
            ~CMoteur( );
    
            bool Demarrer( );
            bool Arreter( );
            void Afficher( );
    };
    
    #endif

    Code:
    /**
     * @(#) CMoteur.cpp
     */
    
    #include <iostream>
    #include <string>
    #include "CMoteur.h"
    using namespace std;
    
    CMoteur::CMoteur( )
    {
         PuissanceDynamique = 0;
         NumSerie = "00000000";
    }
    
    CMoteur::CMoteur(int PD, string NS)
    {
         PuissanceDynamique = PD;
         NumSerie = NS;
    }
    
    CMoteur::~CMoteur( )
    {
    }
    
    
    bool CMoteur::Demarrer( )
    {
          cout<<"Le moteur demarre"<<endl;
    }
    
    bool CMoteur::Arreter( )
    {
          cout<<"Le moteur s arrete"<<endl;
    }
    
    void CMoteur::Afficher( )
    {
          cout<<"Les caracteristiques du moteur sont : "<<endl;
          cout<<"Puissance dynamique : "<<PuissanceDynamique<<endl;
          cout<<"Numero de serie : "<<NumSerie<<endl;
    
    }

    Code:
    /**
     * @(#) CMoteurEssence.h
     */
    
    #ifndef CMOTEURESSENCE_H_H
    #define CMOTEURESSENCE_H_H
    
    #include <iostream>
    #include <string>
    #include "CMoteur.h"
    
    using namespace std;
    
    class CMoteurEssence: CMoteur
    {
    private:
            int VolumeReservoir;
            int NbreSoupape;
            
    public:
            CMoteurEssence( );
            CMoteurEssence(int, string, int, int);
            ~CMoteurEssence( );
    
            void VidangerHuileMoteur( );
            void Afficher( );
            
    };
    
    #endif

    Code:
    /**
     * @(#) CMoteurEssence.cpp
     */
    
    #include <iostream>
    #include <string>
    #include "CMoteurEssence.h"
    using namespace std;
    
    CMoteurEssence::CMoteurEssence(int PD, string NS, int VR, int NbS):CMoteur(PD,NS)
    {
           VolumeReservoir=VR;
           NbreSoupape=NbS;
    }
    
    CMoteurEssence::CMoteurEssence( )
    {
    }
    
    CMoteurEssence::~CMoteurEssence( )
    {
    }
    
    void CMoteurEssence::VidangerHuileMoteur( )
    {
            cout<<"Vidanger l huile moteur"<<endl;
    }
    
    void CMoteurEssence::Afficher( )
    {
            cout<<"Les caracteristiques du moteur essence sont :"<<endl;
            cout<<"Volume du reservoir : "<<VolumeReservoir<<endl;
            cout<<"Nombre de soupapes : "<<NbreSoupape<<endl;
    
    }

    Code:
    #include <iostream>
    #include <string>
    #include "CAutomobile.h"
    #include "CMoteur.h"
    #include "CMoteurEssence.h"
    #include "CAutomobile.cpp"
    #include "CMoteur.cpp"
    #include "CMoteurEssence.cpp"
    
    using namespace std;
    
    int main()
    {
        CMoteur MonMoteur(110,"31AB47K");
        CAutomobile MonAuto(11500,"Blanche","CR-340-AB", MonMoteur);
    
        MonAuto.Afficher( );
        MonMoteur.Afficher( );
    
        return 0;
    }
    J'ai corrigé 13 erreurs mais il m'en reste 6 :

    Nom : erreur 3.jpg
Affichages : 305
Taille : 50,6 Ko

    merci de votre aide....

  18. #17
    invite0bbe92c0

    Re : agrégation et héritage en C++

    Manque le nom du dernier paramètre dans ce constructeur (partant de là, j'ai pas regardé plus loin) :


    Code:
    CAutomobile::CAutomobile (int Px,string Coul,string Immat,CMoteur&)

  19. #18
    invitefe3b1365

    Re : agrégation et héritage en C++

    je n'ai pas compris ta remarque... il me semble qu'il est présent

  20. #19
    invite0bbe92c0

    Re : agrégation et héritage en C++

    Citation Envoyé par nemogoof Voir le message
    je n'ai pas compris ta remarque... il me semble qu'il est présent
    Prends RV chez ton ophtalmo alors.

  21. #20
    jacknicklaus

    Re : agrégation et héritage en C++

    Code:
    LeMoteur=new Moteur(PD,NS);
    PD et NS ne sont ni passés en arguments, ni membres de la classe CAutomobile.
    ca va pas le faire...
    There are more things in heaven and earth, Horatio, Than are dreamt of in your philosophy.

  22. #21
    invite1c6b0acc

    Re : agrégation et héritage en C++

    Citation Envoyé par jacknicklaus Voir le message
    Code:
    LeMoteur=new Moteur(PD,NS);
    PD et NS ne sont ni passés en arguments, ni membres de la classe CAutomobile.
    ca va pas le faire...
    C'est pas grave : de toutes façon la classe Moteur n'existe pas.
    Elle s'appelle CMoteur ...

    @Bluedeep: on a le droit de mettre un paramètre anonyme, si on ne s'en sert pas (un paramètre qui n'est là que pour assurer la cohérence par rapport à d'autres classes, par exemple pour surcharger une méthode d'une classe mère, en garantissant qu'on ne pourra pas appeler la méthode de la classe mère). Il faudra, bien sûr, faire figurer le paramètre lors de l'appel (et peu importe sa valeur).

  23. #22
    invitefe3b1365

    Re : agrégation et héritage en C++

    j'ai fait des modifs :

    Nom : erreur 3.jpg
Affichages : 390
Taille : 74,4 Ko

    il ne reste plus que 3 erreurs !

  24. #23
    invite1c6b0acc

    Re : agrégation et héritage en C++

    Dans CAutomobile::avancer() :
    LeMoteur est un pointeur : LeMoteur.Avancer( ) n'a aucun sens.
    Il faut écrire LeMoteur->Avancer( )

    Idem pour les autres erreurs.

    Et tu devrais corriger aussi les warnings : ça rend la compilation plus propre et dans certains cas ça peut être des erreurs qui se trouvent être compatibles avec la syntaxe.
    Si tes méthodes ne retournent aucune valeur, il ne faut pas déclarer qu'elles doivent en retourner une.

  25. #24
    invitefe3b1365

    Re : agrégation et héritage en C++

    et voilà après correction :
    Nom : erreur 3.jpg
Affichages : 758
Taille : 50,7 Ko

    Je corrige comment les warnings ?

    c'est vrai que j'ai beaucoup de mal mais je commence le C++ depuis peu (décembre) et mes souvenirs de programmation datent des années 90 et le langage "moderne" était le COBOL II !!!
    c'était pas du tout la même façon de faire....

  26. #25
    Jack
    Modérateur

    Re : agrégation et héritage en C++

    La méthode Démarrer doit retourner un booléen d'après ta déclaration et le compilateur ne voit aucun return.

  27. #26
    invite1c6b0acc

    Re : agrégation et héritage en C++

    Soit en déclarant la méthode concernée comme void, soit en retournant une valeur.
    Ou est le problème ?

    [grillé par Jack]

  28. #27
    pm42

    Re : agrégation et héritage en C++

    En tout cas bravo pour la patience parce que l'absence totale d'effort de quelqu'un qui se contente de copier/coller ses messages d'erreur sans chercher à les comprendre, même quand ils sont clairs m'a découragé.

  29. #28
    invitefe3b1365

    Re : agrégation et héritage en C++

    Nom : erreur 3.jpg
Affichages : 273
Taille : 10,5 Ko

    merci !!!
    à savoir que je cherche beaucoup sur internet avant de poser une question... le but est de quand même réfléchir un minimum !!!
    En tout cas, merci à tous ceux qui m'ont aidé !

  30. #29
    invite1c6b0acc

    Re : agrégation et héritage en C++

    +1, pm42

    Mais j'ai continué à répondre parce que la première fois ou j'ai eu le message d'erreur "Request for member Machin in Bidule wich is non-class type" ça m'a laissé perplexe un moment avant que je comprenne que ça signifiait que j'avais mis . à la place de ->

    Je comprends que les messages d'erreur puissent apparaître assez incompréhensibles.

  31. #30
    pm42

    Re : agrégation et héritage en C++

    Oui mais quand on a un "no return statement", on doit pouvoir trouver assez facilement...

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. mécanisme d'agrégation et héritage
    Par invite63fa6979 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 01/12/2015, 17h02
  2. Héritage équitable
    Par roro222 dans le forum Science ludique : la science en s'amusant
    Réponses: 13
    Dernier message: 03/11/2013, 19h04
  3. Héritage
    Par invitecc87dbce dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 27/05/2012, 20h32
  4. L'héritage
    Par vanos dans le forum Science ludique : la science en s'amusant
    Réponses: 5
    Dernier message: 03/04/2012, 01h59