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 :

construction Classe


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut construction Classe
    Bonjour

    Alors voici mon soucis :

    Je dois réaliser la classe Ratio au complet . Pour cela je dois créer deux fichiers Ratio.h et Ratio.cpp, et y placer ce qu'il faut .

    J'ai un modèle sous forme de commentaire , qu'on peut considérer comme le main.cpp , et que je dois petit à petit enlever tout en rajoutant ce qu'il faut au fichier.cpp et fichier.h

    main :

    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
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    #include <iostream>
    #include <string>
     
    using namespace std;
    #include "Ratio.h"
     
    int main()
    {
     
    cout << "1 : Construction de r1 avec deux paramètres entiers : le numerateur et le denominateur." << endl;
     Ratio r1(1,4); // 1: Constructeur avec deux paramètres (numérateur et dénominateur).
     cout << "2 : Construction de r2 avec un seul paramètre entiers : le numerateur." << endl
          << "On veut obtenir le rationnel équivalent a cet entier naturel." << endl
          << "Le denominateur du rationnel a construire est fixe a un." << endl;
     Ratio r2(3);   // 2: Constructeur avec un seul paramètre fabricant l'entier équivalent, ici 3/1.
     cout << "3 : Construction de r3 sans aucun paramètre, ce qu'on appelle le constructeur par defaut." << endl
          << "Le numerateur est fixé à zero et le denominateur à un." << endl;
     Ratio r3;      // 3: Constructeur sans paramètre, équivalent à 0/1.
     cout << "Sur le meme principe, construction de r4 et r5." << endl;
     Ratio r4(1,4);
     Ratio r5(5,6);
     
     // 4: fonction membre Ratio::ecrire()
     cout << endl << "4: Affichage avec Ratio::ecrire() :"<<endl;
     cout << "un quart : r1="; r1.ecrire(); cout << endl;
     cout << "trois    : r2="; r2.ecrire(); cout << endl;
     cout << "zero     : r3="; r3.ecrire(); cout << endl;
     
     
     
    // 5: fonction Ratio::affecter(int numerateur,int denominateur) avec valeurs par défaut identiques à celles du constructeur.
     cout << endl << "5: Fonction Ratio::affecter()" << endl;
     r2.affecter(2,3); cout << "deux tiers : r2="; r2.ecrire(); cout << endl;
     r3.affecter(2);   cout << "deux       : r3="; r3.ecrire(); cout << endl;
     r1.affecter();    cout << "zero       : r1="; r1.ecrire(); cout << endl;
     cout << "Affectation de 1/4 a r1." << endl;
     r1.affecter(1,4); // Juste pour remettre une valeur non-nulle...
     cout << "un quart   : r1="; r1.ecrire(); cout << endl;
     
     
     
     // 6: fonction Ratio::valeur_reelle().
     /*
     cout << endl << "6: Ratio::valeur_reelle()" << endl;
     cout << "r2="; r2.ecrire(); cout << "=" << r2.valeur_reelle()
          << " <- Remarquez que le calcul est seulement une valeur approchée arondie : il faudrait une infinité de '6' après la virgule..." << endl;
     */
     
     // 7: fonction Ratio::inverser().
     /*
     cout << endl << "7: Ratio::inverser()." << endl;
     cout << "r3="; r3.ecrire();
     r3.inverser();
     cout << ". Inverser r3. r3="; r3.ecrire(); cout << '.' << endl;
     */
     
     // 8: constructeur de copie
     /*
     cout << endl << "8: Construction de r comme copie de r1 :" << endl;
     {
      Ratio r(r1);
      cout << " r="; r.ecrire(); cout << endl;
      // Sur cette classe particulière, même si vous ne la faites pas, le constructeur fait automatiquement
      // fonctionnera correctement : il suffit en effet de copier les données membres de l'une dans l'autre.
      // Respectez cependant la consigne et ECRIVEZ DE TOUTES FACONS le constructeur de copie.
     }
     */
     
     // 9: affichage dans les constructeurs et ajout du destructeur.
     // Ajouter le destructeur pour Ratio.
     // Ajoutez des affichages sur cout dans les constructeurs et le destructeur pour indiquer
     // quand ont lieu les constructions et les destructions. Cela ne se fait pas habituellement (les
     // constructions et destructions sont silencieuses !) mais cela vous permettra de vérifier que
     // vous avez compris.
     // Comparez avec l'affichage obtenu avec le résultat obtenu avec le tp7.1.exe fourni.
     /*
     {
      cout << endl << "9: Construction de 4/5 :" << endl;
      Ratio r(4,5);
      cout << "Destruction de 4/5 :" << endl;
     }
     */
     
     // 10: accesseurs numerateur() et denominateur() qui renvoient la valeur de la donnée membre correspondante.
     /*
     cout << endl << "10: Accesseurs :" << endl;
     cout << "r2="; r2.ecrire(); cout << ", numérateur de r2 = " << r2.numerateur() << ", denominateur de r2 = " << r2.denominateur() << endl;
     */
     
     // 11: s'assurer que toutes les fonctions qui ne modifient pas le Rationnel sont marquées en conséquence :
     /*
     {
      const Ratio & r = r2; // Astuce pour faire que le nouveau nom r corresponde dans ce bloc à une version constante de r2.
      cout << endl << "11: operations constantes :" << endl;
      cout << "r="; r.ecrire(); cout << "=" << r.valeur_reelle() << endl;
      cout << "accesseurs : r.numerateur()->"<< r.numerateur() << ", r.denominateur()->" << r.denominateur() << "." << endl;
     }
     */
     
     // 12: operateur << pour les Ratio
     // Une fois que vous savez faire celui-là, aucune raison sur vos prochaines classes de faire la fonction membre ecrire() !
     /*
     cout << endl << "12: operateur d'envoi sur un flux." << endl;
     cout << "r1="<< r1 << endl;
     */
     
     // 13: opérateur d'affectation
     /*
     cout << endl << "13: operateur d'affectation." << endl;
     r2=r1;         // affectation à partir d'une variable nommée.
     cout << "La variable r1=" << r1 << " a bien ete affectee a r2=" << r2 << "." << endl;
     */
     
     // 14: opérateurs arythmétiques
     /*
     cout << endl << "14: operateurs arythmétiques. " << endl
          << "(Il est normal d'avoir des constructions-destructions pour chaque résultat intermédiaire, et vous devez identifier quand elles se produisent !)." << endl;
     cout << "r4=" << r4 << ", r5=" << r5 << endl;
     cout << r4 << " + " << r5 << " = " << r4+r5 << endl;
     cout << endl;
     cout << r4 << " - " << r5 << " = " << r4-r5 << endl;
     cout << endl;
     cout << r4 << " * " << r5 << " = " << r4*r5 << endl;
     cout << endl;
     cout << r4 << " / " << r5 << " = " << r4/r5 << endl;
     cout << endl;
     */
     
     // 15: autres opérateurs d'affectation
     /*
     {
      cout << endl << "15: autres operateurs d'affectation." << endl;
      r2=r4; r1=r5;
      cout << "r1=" << r1 << ", r2=" << r2 << ", r3=" << r3 << endl;
      r3 = r2 += r1; // r2 += r1 équivalent à r2 = r2 + r1;
      cout << "* * * Remarquez qu'il n'y a pas ici de contruction-destruction ! * * *" << endl;
      cout << "r3 = r2 += r1;"<< endl << "r1=" << r1 << ", r2=" << r2 << ", r3=" << r3 << endl;
     
      r2=r4; r1=r5;
      cout << endl << "r1=" << r1 << ", r2=" << r2 << endl;
      r3 = r2 -= r1; // Idem avec -=
      cout << "r3 = r2 -= r1;"<< endl << "r1=" << r1 << ", r2=" << r2 << ", r3=" << r3 << endl;
     
      r2=r4; r1=r5;
      cout << endl << "r1=" << r1 << ", r2=" << r2 << endl;
      r3 = r2 *= r1; // Idem avec *=
      cout << "r3 = r2 *= r1;"<< endl << "r1=" << r1 << ", r2=" << r2 << ", r3=" << r3 << endl;
     
      r2=r4; r1=r5;
      cout << endl << "r1=" << r1 << ", r2=" << r2 << endl;
      r3 = r2 /= r1; // Idem avec /=
      cout << "r3 = r2 /= r1;"<< endl << "r1=" << r1 << ", r2=" << r2 << ", r3=" << r3 << endl;
     }
     */
     
     // 16: Opérateurs de comparaison
     /*
     cout << endl << "16: operateurs de comparaison." << endl;
     {
      Ratio r(10,12);
      if(r1 == r)
        cout << r1 << "==" << r << endl; // Souvenez vous que 5/6 est égal à 10/12 !
      if(r2 != r)
        cout << r2 << "!=" << r << endl;
     }
     */
     
     // 17: Opérateurs de pré et post incrémentation et décrémentation.
     /*
     cout << endl << "17: Opérateurs de pré et post incrémentation et décrémentation." << endl;
     {
      Ratio r;
      cout << endl << "r=" << r << ", r5=" << r5 << endl;
      r = r5++;
      cout << "r = r5++; "<< endl << "r=" << r << ", r5=" << r5 << endl;
     
      r.affecter();
      cout << endl << "r=" << r << ", r5=" << r5 << endl;
      r = r5--;
      cout << "r = r5--; "<< endl << "r=" << r << ", r5=" << r5 << endl;
     
      cout << endl << "Les opérateurs suivants n'utilisent pas de variable locale, " << endl
           << "et se contentent de renvoyer une référence sur le rationnel courant." << endl;
      r.affecter();
      cout << "r=" << r << ", r5=" << r5 << endl;
      r = ++r5;
      cout << "r = ++r5; "<< endl << "r=" << r << ", r5=" << r5 << endl;
     
      r.affecter();
      cout << endl << "r=" << r << ", r5=" << r5 << endl;
      r = --r5;
      cout << "r = --r5; "<< endl << "r=" << r << ", r5=" << r5 << endl;
     }
     */
     
     // On arrive à la fin du main, donc les variables qui lui sont locales sont
     // détruites. Pour les instances de Ratio (c'est-à-dire les variables du type
     // Ratio) qui doivent être détruites, un appel au destructeur ~Ratio() est
     // automatiquement effectué pour chacune d'entre elles.
     /*
     cout << endl << "9: Destruction de r1, r2 et r3:" << endl;
     */
     return 0;
    }
    Voici mon Ratio.h
    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
    class Ratio {
     
    private: 
    int num, den;
     
    public:
    void affecter();
     
    double valeur_reelle();
    void ecrire();
    void inverser();
    Ratio(int n=0, int d=1); // Mécaninsme de valeur par défaut
     
     
     
    };
    Et mon Ratio.cpp

    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
    // Le ratio.cpp permet de connaître la déclaration de la classe , les méthodes ,les définitions , 
    #include <iostream>
    using namespace std;
     
    #include "Ratio.h"
     
    void Ratio::affecter(int n,int d)
    { num=n ; den=d }
     
     double Ratio::valeur_reelle()
    { return ( num / den ); }
     
    void Ratio::inverser()
    { int tmp=num; num=den; den=tmp; }
     
    void Ratio::ecrire()
    { cout << num << '/' << den ; }
     
    Ratio::Ratio(int n,int d) // Info : Le mécanisme par defaut est dans le .h
    { num = n; den = d; }

    Donc , comme on peut le voir dans le main , j'ai enlevé la forme de commentaire de la 5)eme avec la fonction affecter , mais ça bloque ..main.cpp:Erreur no matching function for call to "Ratio::affecter(int , int)"
    Dans le fichier .h , on a par valeur , si on a pas de parametre lors de l'appel , num=0 et den=1 , et cela doit marcher selon ce cas là , c'est à dire aucun param , mais aussi s'il n'y a qu'un seul param .

    Donc comme testé dans le 4) , cela marche bien .

    Voilà donc mon problème , je ne vois pas ou peut être le problème de la méthode affecter qui doit marcher selon 0 ,1,2 nombres de paramètres ..

    Merci d'avance de vôtre aide .

    PS : Si vous avez des conseils pour ce qui suit , je suis preneur
    Dernière modification par LittleWhite ; 14/12/2012 à 14h36.

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,
    Dans ton .h :

    Dans ton .cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Ratio::affecter(int n,int d)
    Tu n'y vois pas comme un soucis ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Oui je sais qu'il y a un soucis , mais je suis tellement pas clair que j'arrive pas à voir ce qui est pas clair ...

    Voici à présent le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void affecter(int n=0, int d=1);
    La compilation se passe bien , ok , mais l'édition de lien , quand je veux transformer en executable toujours un probleme:

    main.p:main.cpp.text+0x...) l'adresse quoi : Undefined reference to ...

  4. #4
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Bah en fait c'est surtout ce qu'il y a après le "Undefined reference to" qui peut dire d'où vient le problème^^

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir . Merci de m'avoir répondu , ça c 'est réglé :

    Dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void affecter(int n=1 , int d=0);
    Dans le .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void Ratio::affecter(int n,int d)
    { num=n ; den=d; }
    Petit nouveau soucis , j'ai réussi les suivants , mais là j'en suis au constructeur/destructeur :

    Voici mes lignes de codes :

    fichier.cpp

    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
    #include <iostream>
    using namespace std;
     
    #include "Ratio.h"
     
     
     
    void Ratio::affecter(int n,int d)
    { num=n ; den=d; }
     
     double Ratio::valeur_reelle()
    { return ( (double) num / den ); }
     
    void Ratio::inverser()
    { int tmp=num; num=den; den=tmp; }
     
    void Ratio::ecrire()
    { cout << num << '/' << den ; }
     
    Ratio::Ratio(int n,int d) // Info : Le mécanisme par defaut est dans le .h
    { num = n; den = d; }
     
    Ratio::Ratio(const Ratio& original)
     :num(original.num),den(original.den)
    {
    }
    Et le fichier.h
    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 Ratio {
     
    private: 
    int num, den;
     
    public:
    void affecter(int n=1 , int d=0);
     
    double valeur_reelle();
    void ecrire();
    void inverser();
    Ratio(const Ratio& original);
    Ratio(int n=0, int d=1); // Mécaninsme de valeur par défaut
     
     
     
    };

    Maintenant , voici le nouveau objectif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // 9: affichage dans les constructeurs et ajout du destructeur.
     // Ajouter le destructeur pour Ratio.
     // Ajoutez des affichages sur cout dans les constructeurs et le destructeur pour indiquer
     // quand ont lieu les constructions et les destructions. Cela ne se fait pas habituellement (les
     // constructions et destructions sont silencieuses !) mais cela vous permettra de vérifier que
     // vous avez compris.
     // Comparez avec l'affichage obtenu avec le résultat obtenu avec le tp7.1.exe fourni.
     {
      cout << endl << "9: Construction de 4/5 :" << endl;
      Ratio r(4,5);
      cout << "Destruction de 4/5 :" << endl;
     }
    Avant tout , j'aurai une question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Ratio::Ratio(int n,int d)             
    { num = n; den = d; }
    On me dit de faire TOUT LE TEMPS de faire un constructeur par défaut . Or ceci est un constructeur par paramètres non ? Ratio(); suffirait ?


    Sinon , j'ai essayé de mettre dans le .h pour le destructeur , mais le compil me dit undefined reference to Ratio::~Ratio()

    Et donc j'ai essayé de la rajouter au .cpp , puis différentes choses , mais en vain !

    Je déteste vraiment les classes , mais j'essaie de faire avec !

  6. #6
    Membre habitué Avatar de zhouyu
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 143
    Points
    143
    Par défaut
    Salut.
    C'est parce que la fonction que tu viens d'ajouter dans ton .h n'est pas défini dans le .cpp

    Il faut que tu rajoutes ton destructeur au .cpp

    S'il ne fait rien tu fait simplement :

  7. #7
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Je ne suis pas sûre que faire tout le temps un constructeur par défaut soit une bonne idée… Je pense qu'il faut garder en tête ce que ta classe doit faire.

    Pour ta question effectivement tu peux simplement utiliser Ratio().

    Pour ton destructeur, dans le .h :

    Et dans le cpp :


  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci de vos réponses , c'est plus clair .

    Si j'ai un autre soucis , je réfléchirais avant .

    Bonne soirée

Discussions similaires

  1. Probleme construction Classe
    Par Invité dans le forum C#
    Réponses: 0
    Dernier message: 13/12/2012, 16h36
  2. Question sur construction de classe avec JFrame
    Par cmako dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 28/03/2007, 11h42
  3. [C#] : Problème de construction de class
    Par dcollart dans le forum C#
    Réponses: 24
    Dernier message: 29/10/2006, 13h54
  4. Problème de construction d'une classe
    Par AraBorLeg dans le forum Langage
    Réponses: 2
    Dernier message: 05/12/2005, 19h07
  5. construction d'une classe
    Par r0d dans le forum C++
    Réponses: 10
    Dernier message: 16/09/2004, 17h35

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