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 :

Classe imbriquées et indépendantes


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Par défaut Classe imbriquées et indépendantes
    Bonjour tous,
    j'ai une question sur la déclaration de classes et leur utilisation (à appliquer à un servomoteur).

    J'aurais ces 2 classes

    Classe TypeRotation
    int Vitesse
    int NbDegres
    int TempsArret
    bool SensHoraire


    Classe TypeBrassage
    int NbAllerRetour
    TypeRotation Aller
    TypeRotation Retour


    Sachant que je voudrais utiliser des variables de TypeRotation et TypeBrassage, comment je construis le plus proprement possible le TypeBrassage qui a 2 TypeRotation différents ?

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

    Informations professionnelles :
    Activité : aucun

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

    Tout simplement: comme tu l'as fait

    Tu as un fichier d'en-tête TypeRotation.hpp (Rotation.hpp ? ) qui ressemble à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef TYPEROTATION_HPP
    #define TYPEROTATION_HPP
    /* j'utilise une structure, car, pour l'instant, je ne vois pas ce que cela 
     * changerait d'en faire une classe
     */
    struct TypeRotation{   // struct Rotation ?
        int vitesse;      // int speed ?
        int nbDegres; // int degrees ?
        int tempArret; // int stopTime ?
        bool sensHoraire; // bool rightToLeft ?
    };
    #endif //TYPEROTATION_HPP
    et un fichier d'en-tête TypeBrassage.hpp qui ressemble à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef TYPEBRASSAGE_HPP
    #define TYPEBRASSAGE_HPP
    #include <TypeRotation.hpp>
    /* Même remarque que pour TypeRotation ;) */
    struct TypeBrassage { // Brewing ?
    /* Dans l'idéal, on place les données les plus grandes en haut des structures
     * (pour une sordide histoire d'alignement, quand cela fait sens ;) )
     */
       TypeRotation aller; // Rotation forth ?
       TypeRotation retour; // Rotation back ?
       int nbAllerRetour;   // int routes ?
    };
    #endif // TYPEBRASSAGE_HPP
    (il est souvent pas mal d'écrire son code en anglais, bien que tu aies évité de tomber dans l'utilisation d'une moitié de termes en anglais et de l'autre moitié en francais ... les commentaires proposent des noms dans la lange de shakespeare )

    De cette manière, en fonction des besoins, tu pourras soit inclure "uniquement" TypeRotation.hpp, si tu n'a vraiment besoin de connaitre que la rotation, ou bien, tu pourras décider d'inclure TypeBrassage.hpp si tu as besoin de connaitre les deux types (la rotation et le brassage)

    L'idée étant toujours de n'inclure que ce qui est strictement indispensable, ni plus (parce que cela ne fait que donner du taf inutile au compilateur) ni moins (parce que, de toutes façons, cela le fera râler)
    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

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Par défaut
    Merci de ta réponse, elle me plaît car bien structurée et expliquée
    J'arrive de l'univers du VisualBasic donc je ne connais pas les " struct "
    J'étudie ça reviendrai avec du code plus précis que j'insérerai comme toi (comment on fait ça ?)

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Par défaut
    Je viens de lire sur les Structures en C++

    Ça me semble la bonne solution car tout est public dans la structure Rotation et Brassage.

    Comme c'est un tout petit programme, tout serait mis dans le même fichier.

    Pour l'anglais, ça me parait naturellement plus proprre en effet mais je veux que ce soit facilement compréhensible par un public large.

    Une question que je n'ai pas trouvé dans ma recherche pour les classes ou structures, comment accède-t'on aux données de rotation d'un brassage ?

    If Brassage.Aller.Vitesse>10
    Ou

    Je dois sortir la structure Rotation dans une variable avant ?

    Merci de ta réponse

    (je te conseille de regarder la vidéo
    "Uncle Bob Clean Code"
    qui décrit comment et pourquoi écrire du ccode proprement
    Tu pourras continuer plus ta démarche de bon code qui semble très bien parti !!!)

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Par défaut
    Rebonjour,
    je reste sur la définition de classes car je pense qu'il y aura des méthodes associées à chacune des classes

    Pas contre, je ne comprends toujours pas comment instancier et bien déclarer ces imbrications de classes

    voici ci-dessous mon code


    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 TypeRotation
    {
        public:
            int NbDegres;
            int Vitesse;
            int TempsArret;
            int Sens;
            TypeRotation(int  intDegres,
                         int  intVitesse,
                         int  intTempsArret);
    };
     
     
     
     
     
    TypeRotation::TypeRotation(int  intNbDegres,
                                          int  intVitesse,
                                          int  intTempsArret)
    {
        NbDegres=intNbDegres; 
        Vitesse=intVitesse; 
        TempsArret=intTempsArret; 
    };
     
     
     
     
     
    class TypeBrassage
    {
        public: 
            TypeRotation RotationAller;
            TypeRotation RotationRetour;
            int          NbAllerRetour;
            TypeBrassage(int  intNbAllerRetour,
                         TypeRotation trAller,
                         TypeRotation trRetour);
    };
     
     
     
     
     
    TypeBrassage::TypeBrassage(int intNbAllerRetour,
                                           TypeRotation trAller,
                                           TypeRotation trRetour)
    {
        NbAllerRetour=intNbAllerRetour;
        RotationAller=Aller; 
        RotationRetour=Retour;        
    };
     
     
     
     
     
    void loop()
    {
        TypeRotation  RotationCourte(158,3,2);
        TypeRotation  RotationLongue(158,3,2);
        TypeBrassage  BrassageAmple(2,RotationLongue,RotationLongue);
        TypeBrassage  BrassageSerre(3,RotationCourte,RotationCourte);
     
        exit(0);
    };

  6. #6
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Tes classes ne sont pas du tout imbriquées.
    Tu as 2 classes, c'est tout, et une utilise l'autre.
    Et vu que les variables sont de simples variables (et pas pointeur ou référence), il faut que son type soit totalement connu avant de l'utiliser.
    Donc Rotation doit être déclarée avant Brassage.
    La bonne pratique est généralement de mettre chaque classe dans un fichier différent, puis tu inclues ce dont tu as besoin, quand tu en as besoin.
    As-tu lu un cours de C++ ? Ça me semble assez basique, t'as dû rater une étape.
    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.

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Par défaut
    J'arrive de l'univers Visual Basic et pratiquement rien de C++.
    Et là, je pars que de ces notions pour programmer un petit actionneur couplé à un servomoteur dans l'IDE Arduino

    Je souhaite que tout tienne dans un seul fichier c'est pourquoi j'avais déclaré la classe TypeRotation et son constructeur- avant- le TypeBrassage et son constructeur.

    A priori en C++ ça n'a pas l'air suffisant ou y a t'il moyen de le faire ?

  8. #8
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Si c'est possible, et ça va marcher, c'est juste que tu vas finir rapidement avec un fichier lourd et difficilement lisible.
    Quitte à ne pas vouloir faire de fichier supplémentaire, tu peux directement implémenter les fonctions avec leur déclaration dans la classe. Ça rendra le tout un peu moins gros imo.
    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.

  9. #9
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Par défaut
    Je viens d'enlever des " ;" qui ne devaient pas être à la fin des procédures de constructions

    Et je crois que pour construire la classe TypeBrassage, il y a une synthaxe spéciale pour construire en meme temps les 2 variables de TypeRotation

    Il n'y aurait pas ":TypeRotation" après TypeBrassage::TypeBrassage?

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par krodelahaye Voir le message
    A priori en C++ ça n'a pas l'air suffisant ou y a t'il moyen de le faire ?
    Ton constructeur de TypeBrassage oblige 3 paramètres, donc tes 2 membres doivent avoir ces données dès leur construction
    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
    class TypeBrassage
    {   public: 
            TypeRotation RotationAller;
            TypeRotation RotationRetour;
            int          NbAllerRetour;
            TypeBrassage(int  intNbAllerRetour,
                         TypeRotation const& trAller,
                         TypeRotation const& trRetour);
    };
    TypeBrassage::TypeBrassage(int intNbAllerRetour,
                              TypeRotation const& trAller,
                              TypeRotation const& trRetour)
        : RotationAller(trAller)  // doit être construit avant le corps du constructeur
        , RotationRetour(trRetour)
        , NbAllerRetour(intNbAllerRetour)
    { 
    }

  11. #11
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    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.

  12. #12
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Par défaut
    Bon, ça compile mais je n'ai pas encore retester sur l'actionneur

    Voici le code complet, j'ajouterai les "const" partout où les variables seront en lecture seule


    Je pense peut-être créer les méthode Brasser et Tourner dans les classe TypeBrassage et TypeRotation
    Brasser deviendrait Actionner pour TypeBrassage.Actionner
    Tourner aussi Actionner pour TypeRotation.Actionner



    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    #include <Servo.h>
    using namespace std;
     
     
    const int TEMPS_MINIMUM=400;
    Servo     srvPanier;
     
     
     
     
     
    class TypeRotation
    {
        public:
            int NbDegres;
            int Vitesse;
            int TempsArret;
            int Sens;
            TypeRotation(int  intDegres,
                         int  intVitesse,
                         int  intTempsArret);
    };
     
     
     
     
     
    TypeRotation::TypeRotation(int  intNbDegres,
                               int  intVitesse,
                               int  intTempsArret)
    {
        NbDegres=intNbDegres; 
        Vitesse=intVitesse; 
        TempsArret=intTempsArret; 
    }
     
     
     
     
     
    class TypeBrassage
    {
        public: 
            TypeRotation RotationAller;
            TypeRotation RotationRetour;
            int          NbAllerRetour;
            TypeBrassage(int          intNbAllerRetour,
                         TypeRotation Aller,
                         TypeRotation Retour);
    };
     
     
     
     
     
     
    TypeBrassage::TypeBrassage(int          intNbAllerRetour,
                               TypeRotation Aller,
                               TypeRotation Retour): RotationAller(Aller), 
                                                     RotationRetour(Retour)
    {
        NbAllerRetour=intNbAllerRetour;
        RotationAller=Aller; 
        RotationRetour=Retour;        
    }
     
     
     
     
     
    void Attendre(int intTemps)
    {
        delay(intTemps);
    }
     
     
     
     
     
    void Attacher(Servo srvMoteur,
                  int   intPin)
    {
        srvMoteur.attach(intPin);
    }
     
     
     
     
     
    void Detacher(Servo srvMoteur)
    {
        srvMoteur.detach();
    }
     
     
     
     
     
    int Position(Servo srvMoteur)
    {
        return(srvMoteur.read());
    }
     
     
     
     
     
    void Positionner(Servo srvMoteur,
                     int   intPosition,
                     int   intTempsAttente)
    {
        srvMoteur.write(intPosition);
        Attendre(intTempsAttente);
    }
     
     
     
     
     
     
    void Initialiser(Servo srvMoteur)
    {
        Positionner(srvMoteur,0,TEMPS_MINIMUM);
    }
     
     
     
     
     
    void Tourner(Servo        srvMoteur,
                 TypeRotation Rotation)
    { 
        int intPositionDepart=Position(srvMoteur);
     
        for (int intCompteur=1;
             intCompteur<=Rotation.NbDegres;
             intCompteur++)
        {     
            Positionner(srvMoteur,intPositionDepart+(Rotation.Sens*intCompteur),Rotation.Vitesse);  
        }   
    };
     
     
     
     
     
    void Brasser(Servo        srvMoteur,
                 TypeBrassage Brassage)
    {
        for (int intCompteur=1;
             intCompteur<=Brassage.NbAllerRetour;
             intCompteur++)
        {      
            Tourner(srvMoteur,Brassage.RotationAller);
            Tourner(srvMoteur,Brassage.RotationRetour);
        }
    };
     
     
     
     
     
    void setup()
    {
    }
     
     
     
     
     
    void loop()
    {
        TypeRotation  RotationCourte(158,3,2);
        TypeRotation  RotationLongue(158,3,2);
        TypeBrassage  BrassageAmple(2,RotationLongue,RotationLongue);
        TypeBrassage  BrassageSerre(3,RotationCourte,RotationCourte);
     
        Attacher(srvPanier,8);
            Initialiser(srvPanier);
            Attendre(3000);
            Brasser(srvPanier,BrassageAmple);
            Attendre(3000); 
            Positionner(srvPanier,120,0);  
            Attendre(3000);
            Brasser(srvPanier,BrassageSerre);
        Detacher(srvPanier);
     
        exit(0);
    }

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

Discussions similaires

  1. [C#]Remonter des événements dans des classes imbriquées
    Par Kcirtap dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/12/2013, 12h43
  2. Classe et Fenêtre indépendante
    Par croc14 dans le forum MFC
    Réponses: 61
    Dernier message: 14/06/2006, 07h57
  3. Classe imbriquée
    Par dj.motte dans le forum C++
    Réponses: 10
    Dernier message: 13/04/2006, 07h34
  4. classes imbriquées
    Par smedini dans le forum C++
    Réponses: 10
    Dernier message: 10/12/2005, 13h16
  5. Intérêt des classes imbriquées ?
    Par elitost dans le forum Langage
    Réponses: 5
    Dernier message: 21/10/2005, 09h30

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