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 :

Initialisation d"un attribut de type class dans une autre class


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur C# - SQL
    Inscrit en
    Octobre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C# - SQL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 19
    Points : 10
    Points
    10
    Par défaut Initialisation d"un attribut de type class dans une autre class
    Bonjour,

    si j'ai 2 classes: disons pour simplifier une classe Moteur et une classe Voiture dont un des membre est de type Moteur, comment initialiser le membre de type Moteur dans le constructeur de la class Voiture:

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    class Moteur
    {
    	private:
    	string type_moteur_;
    	int nb_chevaux_;
     
    	public:
    	Moteur(string type_moteur,int nb_chevaux)
    	: type_moteur_(type_moteur), nb_chevaux_(nb_chevaux)
    	{
    	}
     
    	string getTypeMoteur()
    	{
    		return type_moteur_;
    	}
     
    	int getNbChevaux()
    	{
    		return nb_chevaux_;
    	}
     
     
    };
     
    class Voiture
    {
     
    	private:
    	string type_;
    	string marque_;
    	string model_;
    	string couleur_;
    	Moteur monMoteur_(string s,int i);
     
     
     
     
    	public:
    	Voiture(string type, string marque, string model, string couleur, Moteur monMoteur)
    	: type_(type), marque_(marque), model_(model), couleur_(couleur)//, monMoteur_(Moteur(monMoteur.getTypeMoteur(),monMoteur.getNbChevaux()))
    	{
     
    	}
     
        string getTypeVoiture()
        {
            return type_;
        }
     
         string getMarqueVoiture()
        {
            return marque_;
        }
     
         string getModelVoiture()
        {
            return model_;
        }
     
         string getCouleurVoiture()
        {
            return couleur_;
        }
     
     
     
    };

    J'ai essayé avec le bout commenté dans la liste d'initialisation du constructeur voiture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     monMoteur_(Moteur(monMoteur.getTypeMoteur(),monMoteur.getNbChevaux()))}
    mais j'obtiens un message d'erreur à la compilation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: class 'Voiture' does not have any field named 'monMoteur_'


    Merci pour votre aide.

    Bien cordialement,

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Pour appeler le constructeur de std::string, tu n'as pas écrit marque_(std::string(marque)), mais marque_(marque).
    Pour le moteur, c'est pareil: monMoteur_(monMoteur.getTypeMoteur(),monMoteur.getNbChevaux()).

    Deuxièment, Moteur monMoteur_(string s,int i); est une déclaration de fonction, pas de variable.

    Attention au nom des parametres, ce n'est pas le "monMoteur" de l'objet que tu donne, juste celui que tu vas copier, j'opterais plutot pour "moteur"
    Quant à la variable membre, je t'invite à choisir entre monBidule et Bidule_, car monBidule_ est redondant.

    Je rajoute les références constantes et surtout les fonctions constantes.

    Une déclaration de classe étant en général dans un header, il ne faut pas y mettre de using. Ni using std::string;, ni using namespace std;.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    class Moteur {
    private:
    	std::string type_moteur_;
    	int nb_chevaux_;
     
    public:
    //un constructeur par copie est automatiquement généré
    	Moteur(std::string const& type_moteur, int nb_chevaux) : type_moteur_(type_moteur), nb_chevaux_(nb_chevaux) {}
     
    	std::string getTypeMoteur() const {return type_moteur_;}
     
    	int getNbChevaux() const {return nb_chevaux_;}
    };
     
    class Voiture {
    private:
    	std::string type_;
    	std::string marque_;
    	std::string model_;
    	std::string couleur_;
    	Moteur monMoteur_;
    public:
    	Voiture(std::string const& type, std::string const& marque, std::string const& model, std::string const& couleur, Moteur const& moteur) :
    		type_(type), marque_(marque), model_(model), couleur_(couleur),
    		monMoteur_(moteur.getTypeMoteur(),moteur.getNbChevaux()) // ou monMoteur_(moteur)
    	{}
     
    	std::string getTypeVoiture() const {return type_;}
     
    	std::string getMarqueVoiture() const {return marque_;}
     
     	std::string getModelVoiture() const {return model_;}
     
    	std::string getCouleurVoiture() const {return couleur_;}
    };
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 551
    Points
    218 551
    Billets dans le blog
    118
    Par défaut
    Bonjour,

    Dans la classe Voiture, ce n'est pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Moteur monMoteur_(string s,int i);
    mais simplement :
    Qu'il faut écrire, car c'est une instance de variable comme une autre (comme string, par exemple).

    Ensuite, coté constructeur de la Voiture, il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Voiture(string type, string marque, string model, string couleur, Moteur monMoteur)
    	: type_(type), marque_(marque), model_(model), couleur_(couleur), monMoteur_(monMoteur.getTypeMoteur(),monMoteur.getNbChevaux())
    	{
     
    	}
    Mais je pense que vous pourriez juste faire une copie par le biais du constructeur par copie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Voiture(string type, string marque, string model, string couleur, Moteur monMoteur)
    	: type_(type), marque_(marque), model_(model), couleur_(couleur)//, monMoteur_(monMoteur)
    	{
     
    	}
    Ensuite, dernier conseil : les string et le moteur devrait être des références constante afin d'éviter la copie de ces variables à chaque appel de fonction et une copie supplémentaire qui ne sert pas.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur C# - SQL
    Inscrit en
    Octobre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C# - SQL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Merci à tous pour vos retours et vos conseils.
    Bonne journée.

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

    Informations professionnelles :
    Activité : aucun

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

    En outre, il existe une loi nommé loi de déméter qui dit
    Citation Envoyé par déméter
    Si un objet A (la voiture) utilise en interne un objet B (le moteur), l'utilisateur de A ne devrais pas avoir à connaitre B pour pouvoir utiliser son A
    Autrement dit, tout ce que l'utilisateur (en ce, y compris celui qui va la créer effectivement) d'un objet de type voiture ne doit jamais avoir à s'inquiéter du fait qu'un réservoir est effectivement utilisé.

    Qu'à la limite, il pense que le carburant est maintenu en place par l'action du saint esprit si ça l'amuse, grand bien lui fasse : tout ce qu'il a besoin de savoir à ce sujet, c'est:
    • Où faire rentrer le carburant dans la voiture (la trappe à carburant)
    • De quelle quantité / ratio de carburant il dispose (jauge)
    • (éventuellement) la quantité de carburant utilisée sur une distance donnée (consommation moyene / instantanée / autre ?)
    • (éventuellement) l'autonomie que lui laisse la quantité de carburant dont il dispose
    • ET C'EST TOUT (ou peu s'en faut)



    Du coup, au lieu de passer un objet de type réservoir au constructeur de ta voiture, tu devrais transmettre une chaine de caractères "typeMoteur" et un entier "puissanceMoteur" qui seront transmis au constructeur du moteur
    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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/08/2009, 13h20
  2. Utilisation des méthodes de classe dans une autre classe
    Par ChriGoLioNaDor dans le forum C++
    Réponses: 4
    Dernier message: 28/07/2007, 15h10
  3. utiliser les attribut d'une classe dans une autre classe
    Par kaissaoui dans le forum Langage
    Réponses: 11
    Dernier message: 18/07/2007, 15h13
  4. Réponses: 3
    Dernier message: 25/12/2006, 20h45
  5. Définir une classe dans une autre classe
    Par acieroid dans le forum C++
    Réponses: 7
    Dernier message: 21/05/2006, 23h24

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