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 :

Création d'un constructeur par rapport à deux classes


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Création d'un constructeur par rapport à deux classes
    Bonjour tout le monde,

    J'ai un exercice à faire qui dit ceci :

    [Version 1]

    L'application devra gérer par classe UN tableau dynamique PAR TYPE de véhicules :
    - un véhicule peut être une voiture, un camion ou un bus
    - un véhicule est défini par :
    - une immatriculation
    - un nombre de places (places assises pour des personnes)
    - une voiture est caractérisée en plus par :
    - un volume transportable de marchandises
    - un camion est caractérisé en plus par :
    - un volume transportable de marchandises
    - un poids transportable de marchandises
    - un bus est caractérisé en plus par :
    - un nombre de rangs de sièges passager

    Le programme devra permettre à l'utilisateur :
    - dans un premier temps, d'encoder des véhicules dans l'un et l'autre
    tableaux (en fonction du type)
    - ensuite, de trier les 3 tableaux par ordre croissant d'immatriculation
    - et enfin, d'afficher sous forme d'un seul tableau visuel les véhicules
    en maintenant l'ordre croissant d'immatriculation (technique de la
    fusion de tableaux triés, sauf que l'on ne crée pas le tableau final
    en mémoire mais uniquement à l'affichage)
    Ce qui concerne mon message est ce passage :

    - un véhicule est défini par :
    - une immatriculation
    - un nombre de places (places assises pour des personnes)
    Cela veut dire que je peux donc créer une classe générique pour tous les véhicules car chaque véhicule a au moins ces deux caractéristiques.

    Je pense avoir commencé l'exercice un peu trop rapidement sans avoir analysé le problème.

    Dans la classe, il y'aura deux donnée membres qui seront :

    m_Immatriculation qui sera un CChaine (s'est une fonction qui crée des chaines) et m_NombreDePlaces qui sera un short (je ne pense pas qu'un bus puisse aller jusqu'à 255 places).

    Ces deux membres seront privés, il faut donc que je crée un accesseur et un modificateur pour ces deux membres.

    Question (confirmation surtout) :

    Les modificateurs vont me permettre de modifier les valeurs de mes membres ?

    J'ai créé une classe, j'ai pas mal d'erreur lors de la compilation :

    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
    class Vehicule3
    {
    public:
     
    	Vehicule3();
    	~Vehicule3();
    //	Vehicule3(const Vehicule3& Source);
    	Vehicule3(const char* UneImmatriculation, short UnShort);
     
     
     
    	short		NombreDePlace(UnShort);
    	bool		Immatriculation(const char* UneImmatriculation); //modificateur du nom
    	bool		EstValide() const;
     
     
    private:
    	CChaine		m_Immatriculation;
    	short		m_NombreDePlaces;
     
     
    };
    J'ai aussi fait une classe voiture, cette classe hérite de Vehicule3, elle a donc accès à tout ce qui est publique dans Vehicule3.

    Donc par rapport à l'énoncé, une voiture a en plus un volume transportable de marchandise (VTM) j'ai donc ajouté cela dans la classe CVoiture, je l'ai mis en private, il faut donc que je crée un modificateur pour pouvoir lui affecter une valeur (??) ?

    Est-ce que jusque là s'est correcte ?

    Maintenant je me demande comment je dois créer le constructeur en sachant que les données viennent de deux classes différentes.

    J'ai beaucoup de mal à comprendre les constructeurs même après avoir lu pas mal de livres et d'articles.

    Je vous remercie d'avance pour votre aide.

    beegeesati

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,


    Avant de commencer...

    On ne le répétera jamais assez, il est largement conseillé de préférer l'utilisation de la classe string, disponible par inclusion du fichier d'en-tête <string> dans l'espace de noms std aux chaines de caractères "C style" (tableau de caractères terminé par un '\0')

    Déjà, il y a une bonne partie des informations qui n'ont aucune raison d'être modifiables:
    • Le nombre de personnes
    • Le volume transportable
    • Le poids transportable
    • (on peut même se poser la question de savoir s'il est "logique" d'envisager de changer l'immatriculaion )


    De plus, il n'y a rien à faire, que tu aies affaire à une voiture, à un camion ou à un bus, tu as toujours affaire à... un véhicule (et, inversement, si tu as affaire à un véhicule, tu peux avoir affaire à n'importe quoi )

    En plus, la partie "véhicule" est une partie indispensable à une voiture, un camion ou un bus: supprime la partie véhicule, et tu as une calèche, une remorque ou une charrette à bras, mais en tout cas, plus à ce que tu crois .

    Tout cela pour bien te faire comprendre que la relation qui doit exister entre le véhicule d'un coté et une voiture, un camion ou un bus est réellement un héritage
    Cela signifie que tu devrais sans doute partir sur une base fort proche de
    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
     
    class Vehicule
    {
        /*...à compléter */
        virtual ~Vehicule();
    };
    class Voiture : public Vehicule
    {
        /*...à compléter */
        virtual ~Voiture();
    };
    class Camion : public Vehicule
    {
        /*...à compléter */
        virtual ~Camion();
    };
    class Bus : public Vehicule
    {
        /*...à compléter */
        virtual ~Bus();
    }
    (remarque que les destructeurs doivent être virtuels pour assurer la destruction correcte du bus s'il vient un jour à être considéré comme un véhicule )

    Enfin, les différents constructeurs (de voiture, de camion et de bus) doivent s'assurer de fournir toutes les informations nécessaires pour la construction de l'objet.

    Il devront en outre veiller à appeler le constructeur de la classe de base Véhicule (renseigne toi sur les liste d'initialisation )

    Ainsi, si le constructeur de ta classe Véhicule est du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vehicule(const std::string& immat, short nbplace);
    il faut veiller à ce que le constructeur de la voiture dispose de toutes les informations permettant d'appeler le constructeur du Véhicule.
    Cela signifie qu'il devra ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Voiture(const std::string& immat, short nbplace, int vtm)
    et qu'il devra etre implémenté sous une forme fort proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Voiture::Voiture(const std::string& immat, short nbplace, int vtm):
             Vehicule(immat, nbplace), vtm(vtm)
    {
    }
    Le principe sera identique pour les bus et les camions

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Salut Koala,

    Un super grand merci pour ta réponse.

    Je vais (à nouveau) analyser ta réponse et la décortiquer dans tous les sens.

    Sache simplement que pour l'instant on a pas encore vu les classes virtuelles mais s'est bon à savoir que l'on peut le faire.

    Mais au faita, qu'entends tu par virtual ?

    Encore un grand merci pour ta patience d'ange.

    beegees

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Le mot clé virtuel indique, tout simplement, au compilateur que le comportement réel (final ) de la méthode peut varier en fonction du type réelle de l'objet pour lequel la méthode est appelée.

  5. #5
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Le mot clé virtuel indique, tout simplement, au compilateur que le comportement réel (final ) de la méthode peut varier en fonction du type réelle de l'objet pour lequel la méthode est appelée.
    OK merci Koala,

    Je vais me baser sur ce que tu dis (en tout cas certains points) pour faire mon exercice.

    Bonne soirée à toi.

    beegees

  6. #6
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    petite remarque: un unsigned short peux aller jusqu'à 65535 (ou environ), si tu veux vraiment faire des économies d'espaces tu peux utiliser un unsigned char, qui va jusqu'à 255, par contre il faudra le convertir en int avant d'afficher.

Discussions similaires

  1. Constructeur par copie et classe abstraite
    Par Benlev dans le forum C++
    Réponses: 15
    Dernier message: 30/10/2009, 18h01
  2. Création d'un contexte par rapport à un gpu
    Par JBond007 dans le forum OpenGL
    Réponses: 2
    Dernier message: 10/09/2009, 08h55
  3. Réponses: 6
    Dernier message: 13/05/2007, 23h14
  4. Recherche dans table de BDD par rapport à deux champs
    Par kiops dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/03/2007, 12h21
  5. Réponses: 5
    Dernier message: 03/12/2006, 15h55

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