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 :

constructeur de copie


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut constructeur de copie
    Bonjour,

    J'ai un problème avec le code suivant (programme qui cree des objets de classe TIME pour stocker et afficher une heure sous la fome hh:mm:ss) :

    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
    #include <iostream>
    #include <iomanip>
     
    using namespace std;
     
    class Time
    {
       private :
     
       int m_hours;
       int m_minutes;
       int m_secondes;
     
       public :
     
       Time (float hours)
       {
          m_hours = (int) hours;
          m_minutes = (int) ((hours - m_hours) * 60);
          m_secondes = 0;
       }
     
       Time (int hours = 0, int minutes = 0, int secondes = 0) :
             m_hours (hours), m_minutes (minutes), m_secondes (secondes)
       {
          cout << "constructeur 3 arguments " << endl;
       }
     
       Time (const Time &t)
       {
          if (t.m_hours >= 0 && t.m_hours < 24)
          {
             if (t.m_minutes >= 0 && t.m_minutes < 60)
             {
                if (t.m_secondes >= 0 && t.m_secondes < 60)
                {
                   m_hours = t.m_hours;
                   m_minutes = t.m_minutes;
                   m_secondes = t.m_secondes;
     
                   cout << "Constructeur de copie " << endl;
                }
                else
                {
     
                   cout << "error" << endl;
                }
             }
             else
             {
                cout << "error" << endl;
             }
          }
          else
          {
             cout << "error" << endl;
          }
       }
     
       void display ()
       {
          cout << setfill ('0') << setw (2) << m_hours
               << ":" << setw (2) << m_minutes
               << ":" << setw (2) << m_secondes << endl;
       }
    };
     
    Time func ()
    {
       Time tmp (33,33,33);
     
       return tmp;
    }
     
    int main ()
    {
       Time t1;
     
       t1.display ();
     
       t1 = func ();
     
       t1.display ();
     
       return EXIT_SUCCESS;
    }
    normalement mon constructeur de copie affiche un message d'erreur si je ne mets pas une heures valide (sous la forme 00:00:00), or dans cette fonction qui retourne un objet de la classe Time je fais une initialisation non valide (33:33:33) (jusque là rien d'anormal vu que mon constructeur ne fais pas de vérification).

    par contre quand je fais

    t1 = func ();

    normalement là il devrait y avoir appel du constructeur de copie (et donc affichage du message d'erreur), or rien du tout t1 recçoit les valeurs 33:33:33
    et pas d'erreur.

    je comprends pas ce qui cloche )

  2. #2
    screetch
    Invité(e)
    Par défaut
    il n'y a pas appel au constructeur de copie, il y a appel a l'operateur = qui a ete redefini automatiquement par le compilateur.

    quand on fait un constructeur de copie on doit (presque) toujours definir l'operateur = qui va avec

  3. #3
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Si tu le souhaite, boost propose également de très bons outils pour gérer le temps : http://www.boost.org/doc/html/date_time.html

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Si tu le souhaite, boost propose également de très bons outils pour gérer le temps : http://www.boost.org/doc/html/date_time.html
    Bonsoir,

    en faite c'est exemple c'était juste parceque j'apprend le c++ (j'ai pas vraiment besoin de gérer le temps - du moins pas encore)

    Merci

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par screetch Voir le message
    il n'y a pas appel au constructeur de copie, il y a appel a l'operateur = qui a ete redefini automatiquement par le compilateur.

    quand on fait un constructeur de copie on doit (presque) toujours definir l'operateur = qui va avec
    Bonsoir,

    sur ce point c'est compris, mais quand j'éxécute ce code dans le main ()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    int main ()
    {
       Time t1 (33,33,33);
       Time t2 = t1;
     
       t2 = t1;
       t2.display ();
     
       return EXIT_SUCCESS;
    }

    j'ai du mal à comprendre pouquoi dans la ligne

    Time t2 = t1;

    il y a appel au contructeur de copie.

  6. #6
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       Time t1 (33,33,33);
       Time t2 = t1;
    appel au constructeur de copie car on est en train de declarer t2 en lui donnant une valeur initiale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       Time t1 (33,33,33);
       Time t2;
       t2 = t1;
    appel a l'operateur =

    ce qui est important c'est : est ce que l'objet avait une autre valeur avant ? si oui, alors on appel operator= dont le role est de "deconfigurer" l'objet en cours et le "reconfigurer" avec la nouvelle valeur. cela consiste en la desallocation de memoire par exemple, avant une nouvelle affectation.

    Si il n'y avait pas d'autre valeur avant, alors on appelle le constructeur par copie qui lui n'effectue pas cette "deconfiguration".

    dans la ligne
    t2 n'a pas encore de valeur, et on veut y mettre t1.

    Ceci est une interpretation du langage cependant; on pourrait decomposer l'action en deux sous actions (construire t2 sans argument, puis y affecter t1) ou bien en une seule fois. c'est un raccourci du langage de dire que les deux lignes suivantes sont equivalentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       Time t2 = t1;
       Time t2(t1);

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Merci bcp pour ton explication, cette notion n'était pas très bien expliquée dans mon livre.

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    <la question initiale ayant été adressée...>

    Citation Envoyé par exhortae Voir le message
    normalement mon constructeur de copie affiche un message d'erreur si je ne mets pas une heures valide (sous la forme 00:00:00), or dans cette fonction qui retourne un objet de la classe Time je fais une initialisation non valide (33:33:33) (jusque là rien d'anormal vu que mon constructeur ne fais pas de vérification).
    Ce qui est idiot. C'est au contraire un des seuls endroits où ces vérifications devraient être opérées.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    <la question initiale ayant été adressée...>


    Ce qui est idiot. C'est au contraire un des seuls endroits où ces vérifications devraient être opérées.

    Bonsoir,

    tout à fait d'accord avec toi, l'exemple présenté c'était juste pour comprendre un peu comment focntionne le constructeur de copie

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

Discussions similaires

  1. [résolu]les constructeurs de copie
    Par pouss dans le forum Langage
    Réponses: 9
    Dernier message: 28/06/2005, 10h57
  2. Réponses: 3
    Dernier message: 24/04/2005, 14h19
  3. [C++]Heritage et constructeur de copie
    Par matazz dans le forum C++
    Réponses: 2
    Dernier message: 25/03/2005, 12h31
  4. Constructeur de copie modifiant le paramètre ?
    Par Nicodemus dans le forum C++
    Réponses: 4
    Dernier message: 12/01/2005, 21h25
  5. Constructeur de copie et Template: Transtypage
    Par ikkyu_os dans le forum Langage
    Réponses: 9
    Dernier message: 26/12/2004, 22h29

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