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 :

comment intégrer une classe dans une autre classe


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Février 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut comment intégrer une classe dans une autre classe
    bonjour je suis en train d'apprendre C++, et je n'arrive pas a faire une classe imbriqué, je suis désolé mais mon bouquin est un peut confus, aussi j'ai réussi a déclarer les classes, mais je n'arrive pas à déclarer la classe moteur dans la classe voiture, pourtant toute les définition son bonne, c'est certainement une erreur de syntaxe, aussi votre aide me serait précieuse. merci.


    Gravité Code Description Projet Fichier Ligne État de la suppression
    Erreur (active) E0079 spécificateur de type attendu Class c:\Users\gs\Documents\Visual Studio 2017\Projects\Class\Class\Class.cpp 47



    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    // Class.cpp : définit le point d'entrée pour l'application console.
    //
     
    #include "stdafx.h"
    #include <iostream>
     
    using namespace std;
     
    class moteur							// classe moteur
    {
    public:
     
    	moteur(int nombrecv);
    	~moteur();
     
    private:
     
    	int sonmoteur;
     
    };
     
     
    moteur::moteur(int nombrecv)			// Constructeur moteur	
    {
    	sonmoteur = nombrecv;
     
    }
     
    moteur::~moteur()						// destructeur moteur
    {
     
    }
     
     
     
     
    class voiture
    {
    public:
    	voiture(int vitesseinitiale);				// déclaration Constructeur
    	~voiture();									// déclaration Destructeur
    	int lirevitesse();							// déclaration des méthodes/fonctions de la classe
    	void stopper();
    	void accelerer();
     
        moteur deuxchevaux(2);                            // c'est ici que se situe l'erreur
     
    private:
    	int vitesse;
    };
     
    voiture::voiture(int vitesseinitiale)			// Constructeur
    {
    	vitesse = vitesseinitiale;
     
    }
    voiture::~voiture()								//Destructeur 
    {
    	cout << "appel destructeur" << endl;
    }
     
     
     
    int voiture::lirevitesse()
    {
     
    	cout << "vitesse : " << vitesse << endl;
    	return vitesse;
    }
     
    void voiture::stopper()
    {
    	vitesse = 0;
     
    }
     
    void voiture::accelerer()
    {
    	vitesse = 100;
     
    }
     
     
     
     
     
    int main()
    {
    	//	moteur test(2);              fonctionne
     
    	voiture peugeot(0);
    	peugeot.lirevitesse();
     
    	peugeot.accelerer();
    	peugeot.lirevitesse();
    	peugeot.stopper();
    	peugeot.lirevitesse();
    	peugeot.~voiture();
    	peugeot.lirevitesse();
     
     
    	return 0;
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ceci n'est pas une classe imbriquée mais juste l'utilisation d'une classe comme membre.
    Et un membre ça se déclare simplement, ce n'est pas l'appel à un constructeur dans la déclaration.. l'appel au constructeur doit se faire dans la liste d'initialisation.
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Voiture {
    ...
    Moteur moteur;
    };
     
    Voiture::Voiture() : moteur(..) {}
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Février 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    salut bousk, merci pour tes inputs mais j'avoue que ça reste encore assez obscur, je voudrais déclarer la classe moteur dans la classe voiture, (c à d) une voiture a un moteur, mon bouquin n'est pas très clair, et je ne comprends pas très bien ta syntaxe, pourrais tu stp détailler un peut plus ??? merci bcp

    nb. j'ai modifié le listing, il m'indique qu'il n'y as pas de constructeur pour moteur alors qu'il y en as un.......... ((((((((((((

    de plus normalement pour initié moteur il faudrait indiquer : moteur moteur(2);

    par exemple mais ça ne fonctionne pas.

    Gravité Code Description Projet Fichier Ligne État de la suppression
    Erreur (active) E0291 il n'existe aucun constructeur par défaut pour la classe "moteur" Class c:\Users\gs\Documents\Visual Studio 2017\Projects\Class\Class\Class.cpp 53


    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
     
    // Class.cpp : définit le point d'entrée pour l'application console.
    //
     
    #include "stdafx.h"
    #include <iostream>
     
    using namespace std;
     
    class moteur							// classe moteur
    {
    public:
     
    	moteur(int nombrecv);
    	~moteur();
     
    private:
     
    	int sonmoteur;
     
    };
     
     
    moteur::moteur(int nombrecv)			// Constructeur moteur	
    {
    	sonmoteur = nombrecv;
     
    }
     
    moteur::~moteur()						// destructeur moteur
    {
     
    }
     
     
     
     
    class voiture
    {
    public:
    	voiture(int vitesseinitiale);				// déclaration Constructeur
    	~voiture();									// déclaration Destructeur
    	int lirevitesse();							// déclaration des méthodes/fonctions de la classe
    	void stopper();
    	void accelerer();
        moteur moteur;                            // c'est ici que se situe l'erreur
     
    private:
    	int vitesse;
    };
     
    voiture::voiture(int vitesseinitiale)			// Constructeur
    {
    	vitesse = vitesseinitiale;
     
    }
    voiture::~voiture()								//Destructeur 
    {
    	cout << "appel destructeur" << endl;
    }
     
     
     
    int voiture::lirevitesse()
    {
     
    	cout << "vitesse : " << vitesse << endl;
    	return vitesse;
    }
     
    void voiture::stopper()
    {
    	vitesse = 0;
     
    }
     
    void voiture::accelerer()
    {
    	vitesse = 100;
     
    }
     
     
     
     
     
    int main()
    {
    	//	moteur test(2);              fonctionne
     
    	voiture peugeot(0);
    	peugeot.lirevitesse();
     
    	peugeot.accelerer();
    	peugeot.lirevitesse();
    	peugeot.stopper();
    	peugeot.lirevitesse();
    	peugeot.~voiture();
    	peugeot.lirevitesse();
     
     
    	return 0;
    }
    si je vire le constructeur et je laisse le constructeur par défaut ça semble se compiler.

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

    Informations professionnelles :
    Activité : aucun

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

    Bon, je ne sais pas quel bouquin tu utilises, mais on va commencer par les remarques "standard"

    1- On n'utilise pas la directive using namespace std; : cette directive a été introduite au tout début de la standardisation pour permettre aux programme qui utilisaient une version "non standardisée" de la bibliothèque standard de continuer à compiler en nécessitant "un minimum de modifications". Ce temps est bien loin, maintenant (à peu près vingt ans), et tous les compilateurs utilisent un version de la SL qui se trouve dans l'espace de noms std... Il n'y a donc aucune raison d'utiliser cette directive

    2- les appels à std::cout dans tes fonctions membres n'ont aucune raison d'être, et occasionnent une dépendance inutile de ta classe Voiture avec la sortie standard. Tu serais bien inspiré de virer ces appels, ce qui te permettra de virer l'inclusion de iostream

    3- Sépare tes fichiers en deux: d'un coté (dans un fichier portant l'extension *.hpp), tu ne met que la définition de la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Machin{
       /*... */
    };
    et dans un fichier portant l'extension *.cpp, tu met l'implémentation des fonctions membres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void MaClasse::fonction(){
        /* ...*/
    }
    Cela te permettra de faire connaître au compilateur les classes dont tu as besoin (par exemple la classe Moteur) simplement en incluant le fichier d'en-tête adéquat (ex: #include <Moteur.hpp> dans le fichier Voiture.hpp )

    4- Le destructeur d'une classe (~MaClasse() est l'une des quatre fonctions que le compilateur est parfaitement en mesure de définir si tu ne lui donne pas de raison de faire autrement... Facilite toi la vie : si le destructeur n'a rien d'intéressant à faire, laisse le compilateur se charger de le mettre en place

    Dans le cas présent, tu n'as rien à faire faire au destructeur de tes classes Moteur et Voiture; tu peux donc laisser le compilateur s'en occuper pour toi

    Tu n'as aucune raison de vouloir accéder à l'élément de type Moteur depuis l'extérieur de la classe Voiture. En vertu de la loi de Déméter, la données Moteur moteur; de ta classe Voiture devrait être privée, au même titre que la donnée vitesse

    5- Dans les constructeurs, il est préférable d'utiliser la liste d'initialisation, surtout lorsque le constructeur d'une donnée membre s'attend à recevoir un paramètre (*)

    6- Les fonctions membres qui n'ont pas vocation à modifier l'état de ton objet (comme lirevitesse) devraient être déclarée comme étant des fonctions constantes

    7- On ne fait JAMAIS appel explicitement au destructeur d'une voiture. Les règles de portée s'en chargeront bien toutes seules. Et on ne le fait SURTOUT PAS si on veut encore utiliser la variable par la suite!!! : quand tu essayes d'invoquer peugeot.lirevitesse(); tout juste après avoir invoqué peugeot.~voiture(); la voiture représentée par la variable peugeot a été officiellement détruite. Il n'en reste rien! Ce n'est plus qu'un cube de métal de 50cm de cotés! Essayer de lire la vitesse ne peut mener qu'à des catastrophes!

    8- Plusieurs appels à la fonction accelerer() ne vont pas faire varier d'avantage la vitesse de ta voiture, vu que tu définis la vitesse à une valeur constante dans cette fonction. Peut-etre devrais tu indiquer une différence de vitesse, qui ferait augmenter la vitesse de manière graduelle (et faire pareil pour la fonction decelerer
    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
    class Voiture{
    public:
        void accelerer(size_t diffVitesse);
        void decelerer(size_t diffVitesse);
        /* ... */
    private:
        size_t maxVitesse{240};
        size_T vitesse;
    };
    void Voiture::accelerer(size_t diffVitesse){
        vitesse+=diffVitesse;
        if(vitesse < maxVitesse)
           vitesse = maxVitesse;
    }
    void Voiture::decelerer(size_t diffVitesse){
        if(diffVitesse> vitesse){
            vitesse=0;
       }else{
           vitesse -=diffVitesse;
       }
    }
     
    int main(){
        Voiture v(0);
        while(v.lirevitesse() <120){
            v.accelerer(10);
            std::cout<<v.lirevitesse()<<"\n";
        }
       while(v.lirevitesse() >= 0){
           v.decelerer(10);
            std::cout<<v.lirevitesse()<<"\n";
       }
    }
    Si tu corriges déjà ton code pour tenir compte de ces différentes remarques, tu devrais déjà faire un grand pas dans la bonne direction

    (*) Notes que, depuis C++11, il est possible d'utiliser une forme "standardisée" pour définir les données à l'aide des opérateurs {} et que l'on peut définir les données membres sous la forme de Moteur deuxChevaux{2};Cela nécessite néanmoins le support de C++11 ou ultérieur. Il est possible que tu doive l'activer de manière explicite
    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

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/10/2015, 08h43
  2. Réponses: 3
    Dernier message: 13/09/2015, 19h21
  3. Réponses: 1
    Dernier message: 17/06/2015, 17h52
  4. Réponses: 6
    Dernier message: 11/06/2009, 18h16
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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