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 :

surcharge de fonction


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Par défaut surcharge de fonction
    bonsoir svp j'ai besoin d'explication. faites le le plus simplement du monde car
    j'ai besoin de comprendre. merci les differentes questions se trouvent dans le 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
     
    Duree Duree::operator+(const Duree &duree)
    {
        int heures = m_heures;
        int minutes = m_minutes;
        int secondes = m_secondes;
    //premiere question
    //pourquoi ne met on pas 
    // secondes += duree2.m_seconde ?
     
    //deuxieme question 
    //ausii je vois que secondes represente represente les secondes de la duree1 
    //mais je comprend pas comment car pour acceder à un element on doit 
    //faire objet.attribut ou objet .methode donc comment accede t-on 
    //a la valeur de duree1 et duree2?      
     
           secondes += duree.m_secondes; 
           minutes += secondes / 60;
           secondes %= 60;
     
     
        minutes += duree.m_minutes;
     
        heures += minutes / 60;
        minutes %= 60;
     
     
        heures += duree.m_heures;
     
    //enfin cette ligne je ne la comprend pas du tout 
     
        // Création de l'objet resultat et retour
        Duree resultat(heures, minutes, secondes);
        return resultat;
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    1. Ben c'est ce qu'on fait, non?
    2. Il n'y a pas de duree1 et duree2 ici: Il n'y a que this (pointeur) et duree (référence)
    3. On crée un objet de type Duree en appelant son constructeur pour y mettre les valeurs de retour. Puis on retourne cet objet.

    PS: Attention à ne pas confondre operator+ et operator+=...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Par défaut surcharge de l'operateur+
    merci medinoc mais j'avoue que ne comprend pas toujours j'ai besoin d'un peu d'explication car beaucoup de choses sont floues dans ma tete.
    l

  4. #4
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonsoir,
    Je vais tenter de t'aider, mais si tu ne comprend pas, pense à aller voir dans un vrai cour de C++

    //pourquoi ne met on pas
    // secondes += duree2.m_seconde ?
    La variable "secondes" est un int qui vient juste d'être construit, il faut donc d'abord l'initialiser, avant de lui ajouter duree.m_secondes
    C'est ce que fait le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int secondes = m_secondes;
    secondes += duree.m_secondes;

    //ausii je vois que secondes represente represente les secondes de la duree1
    //mais je comprend pas comment car pour acceder à un element on doit
    //faire objet.attribut ou objet .methode donc comment accede t-on
    //a la valeur de duree1 et duree2?
    Celui que tu appel "duree1" s'appel ici "this" car tu est "dedans" (il y a surement un terme technique pour dire ça...).
    Tu peut donc y accéder en faisant: this->m_secondes (car this est un pointeur)
    Mais comme Mr C++ est gentil (il y a surement aussi un terme technique pour dire ça ), tu peu aussi écrire m_secondes directement.
    Ce qui donne par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int secondes = m_secondes;
    //enfin cette ligne je ne la comprend pas du tout
    Je supose que tu parle de ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Duree resultat(heures, minutes, secondes);
    Il faut bien comprendre, comme le dit Médinoc, que ton opérateur est un "+", et pas un "+=", c'est a dire qu'il va faire l'addition est te renvoyer un NOUVEAU objet contenant le résultat, SANS MODIFIER tes deux durées.
    Cette ligne déclare donc un NOUVEAU objet de type Duree, avec les valeur qui vienne d'être calculer, pour pouvoir le renvoyer..

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Par défaut surcharge de l'operateur+
    bonsoir et merci pour les details de la reponse.Cependant j'ai toujours faim.
    les cours je les ai lu et relu.
    je vais reformuler ma question .

    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
     
    Duree Duree::operator+(const Duree &duree)
    {
        int heures = m_heures;
        int minutes = m_minutes;
        int secondes = m_secondes;
     
     
           secondes += duree.m_secondes; 
           minutes += secondes / 60;
           secondes %= 60;
     
     
        minutes += duree.m_minutes;
     
        heures += minutes / 60;
        minutes %= 60;
     
     
        heures += duree.m_heures;
     
    //enfin cette ligne je ne la comprend pas du tout 
     
        // Création de l'objet resultat et retour
        Duree resultat(heures, minutes, secondes);
        return resultat;
    }
    1:on considere par exemple
    Duree duree1(01,24,32) , duree2(3,45,23).
    pour ce qui est de duree1() est ce parce qu'il est en premiere position que je suis dedans ? selon ce que tu as dis

    Celui que tu appel "duree1" s'appel ici "this" car tu est "dedans" (il y a surement un terme technique pour dire ça...).
    Tu peut donc y accéder en faisant: this->m_secondes (car this est un pointeur)
    2: dans le prototype de la fonction &duree est mis pour duree1 ou duree2 ?

    si dans le code je met
    secondes += duree.m_secondes est ce different de
    secondes += duree2.m_secondes

    merci de repondre à mes questions

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ton code n'est pas const-correct.
    Remplace
    Duree Duree::operator+(const Duree &duree)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Duree Duree::operator+(const Duree &duree) const
    Sinon à part ça, ça aurait sûrement été plus intéressant d'implémenter operator+ à partir de operator+=.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Sinon à part ça, ça aurait sûrement été plus intéressant d'implémenter operator+ à partir de operator+=.
    Je plussoie, et j'en fait la démonstration:
    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
    Duree& Duree::operator+=(const Duree& duree)
    {
    	m_secondes += duree.m_secondes;
    	m_minutes += m_secondes / 60;
    	m_secondes %= 60;
     
    	m_minutes += duree.m_minutes;
    	m_heures += m_minutes / 60;
    	m_minutes %= 60;
     
    	m_heures += duree.m_heures;
    	return *this;
    }
     
    Duree Duree::operator+(const Duree& duree) const
    {
    	Duree resultat(*this);
    	resultat += duree;
    	return resultat;
    }
    Et à part ça, généralement, on implémente l'opérateur + en tant que fonction libre, plutôt qu'en tant que fonction membre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par newk++ Voir le message
    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
     
    Duree Duree::operator+(const Duree &duree)
    {
        int heures = m_heures;
        int minutes = m_minutes;
        int secondes = m_secondes;
     
     
           secondes += duree.m_secondes; 
           minutes += secondes / 60;
           secondes %= 60;
     
     
        minutes += duree.m_minutes;
     
        heures += minutes / 60;
        minutes %= 60;
     
     
        heures += duree.m_heures;
     
    //enfin cette ligne je ne la comprend pas du tout 
     
        // Création de l'objet resultat et retour
        Duree resultat(heures, minutes, secondes);
        return resultat;
    }
    Puis son utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Duree duree1(01,24,32) , duree2(3,45,23);
    Duree resultat;
     resultat = duree1 + duree2;
    Citation Envoyé par newk++ Voir le message
    1:on considere par exemple
    Duree duree1(01,24,32) , duree2(3,45,23).
    pour ce qui est de duree1() est ce parce qu'il est en premiere position que je suis dedans ? selon ce que tu as dis
    L'écriture duree1 + duree2 est équivalente à duree1.operator+(duree2). Donc, cela signifie que la méthode operator+ est appelée sur duree1 avec comme paramètre duree2. duree1 sera donc this (ou implicite) et duree2 sera le paramètre duree.


    Citation Envoyé par newk++ Voir le message
    2: dans le prototype de la fonction &duree est mis pour duree1 ou duree2 ?
    Souviens-toi que duree1+duree2 est équivalent à duree1.operator+(duree2). Donc, this correspondra à duree1 et duree correspondra à duree2.

    Citation Envoyé par newk++ Voir le message
    si dans le code je met
    secondes += duree.m_secondes est ce different de
    secondes += duree2.m_secondes
    Oui. Le second cas ne va pas compiler! Il faut comprendre le mécanisme de portée des variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main()
    {
    duree duree1(12,36,45);
    duree duree2(4,17,23);
    duree resultat = duree1 + duree2;
    }
    duree1 et duree2 ne sont connus comme symboles que dans main().
    Dans Duree Duree::operator+(const Duree &duree), les variables connues sont this et duree. Lorsque tu fais l'appel duree1 + duree2, le compilateur se charge de faire correspondre this<->duree1 et duree<->duree2 (mécanisme de passage des paramètres).
    D'ailleurs, comment ferais-tu pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main()
    {
    duree duree1(12,36,45);
    duree duree2(4,17,23);
    duree resultat = duree1 + duree2;
    duree duree3(1,7,12);
    duree duree4(0,08,3);
    resultat = duree3 + duree4;
    }
    Enfin, Medinoc et loufoque te donne les bonnes pratiques dans ce genre de choses (const et affectation):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Duree Duree::operator+(const Duree& duree /* car duree ne sera pas modifié*/) const /* car this ne sera pas modifié*/
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Duree Duree::operator+(const Duree& duree) const
    {
    	Duree resultat(*this);// on en fait une copie car this ne peut être modifié
    	resultat += duree;// on laisse fait la somme dans += pour ne pas dupliquer de code ici
    	return resultat;
    }

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Par défaut surcharge de l'operateur+
    Merci 3D Archi je te suis mieux.
    duree1 et duree2 ne sont connus comme symboles que dans main().
    Dans Duree Duree::operator+(const Duree &duree), les variables connues sont this et duree. Lorsque tu fais l'appel duree1 + duree2, le compilateur se charge de faire correspondre this<->duree1 et duree<->duree2 (mécanisme de passage des paramètres).
    D'ailleurs, comment ferais-tu pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main()
    {
    duree duree1(12,36,45);
    duree duree2(4,17,23);
    duree resultat = duree1 + duree2;
    duree duree3(1,7,12);
    duree duree4(0,08,3);
    resultat = duree3 + duree4;
    }
    ce que je comprend de ce code
    c'est que la meme methode operator+ fait addition des duree1 et duree2 et
    et de duree3 et duree4

    en consequence

    dans le premier cas ce sera duree1.operator+ (duree2)
    duree1 est alors le this et duree2 le parametre c-a-dire (&duree)

    dans l'autre cas
    ce sera duree3.operator+(duree4) et stocke cela dans resultat.
    la nouvelle valeur de resultat sera alors la somme de duree3 et de duree4
    duree3 est le this et duree4 sera passé alors en parametre(&duree).

    merci

Discussions similaires

  1. surcharge de fonction
    Par BigNic dans le forum C++
    Réponses: 2
    Dernier message: 21/03/2006, 18h57
  2. API HOOK, Dump dll, Surcharge de Fonction
    Par MicroAlexx dans le forum Windows
    Réponses: 2
    Dernier message: 30/12/2005, 10h39
  3. [MFC] Surcharger des fonctions de CView
    Par Philippe320 dans le forum MFC
    Réponses: 2
    Dernier message: 22/11/2005, 21h24
  4. singleton, polymorphisme, et surcharge de fonction
    Par legend666 dans le forum C++
    Réponses: 11
    Dernier message: 14/11/2005, 09h27
  5. Surcharge de fonction d'un edit dynamique
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/10/2003, 11h56

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