Résolu Problème avec mon operator+=()

Solutions (1)
Tags :
  • implementation
  • classe
  • c++
  • operator
  • operateur
  • surcharge
|
Bonjour,

Je suis un debutant en C++. Je travaille avec les programme orientée d'objet pour la premiere fois. Puis, je suis entraine de faire des calcules pour ma classe Temps. Mais, il y a un probleme. Quand je fais "total += TempsX;", ça affiche : "0 seconde(s)". Pourtant quand je fais "total = TempsX + TempsY;", ça affiche l'heure parfaitement. Quelqu'un peut trouver une solution a mon probleme.
-------------------------------------------------------------------------------------
Temps.h
  1. #ifndef DEF_TEMPS
  2. #define DEF_TEMPS
  3.  
  4. /* Creation de la classe temps qui me permettera de calculer du temps avec le temps */
  5. class Temps
  6. {
  7. /* Les attributs du temps */
  8. private:
  9. int m_semaine;
  10. int m_jour;
  11. int m_heure;
  12. int m_minute;
  13. int m_seconde;
  14. int m_secondeAbsolu;
  15.  
  16. /* Action que le temps peut faire */
  17. public:
  18. Temps(int heure = 0,int minute = 0, int seconde = 0);
  19. void balancer();
  20. int get_secondeAbsolu() const;
  21. Temps operator+(Temps const& a);
  22. void afficher() const;
  23. Temps operator+=(const Temps& a);
  24. };
  25.  
  26. #endif


-------------------------------------------------------------------------------------
Temps.cpp
  1. #include "Temps.h"
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. // Construction du temps
  6. Temps::Temps(int heure,int minute, int seconde)
  7. {
  8. //Placer les parametre dans les arguments
  9. m_heure = heure;
  10. m_minute = minute;
  11. m_seconde = seconde;
  12. m_jour = 0;
  13. m_semaine = 0;
  14. m_secondeAbsolu = 0;
  15.  
  16. //Calculer les secondes Absolus
  17. //Si l'heure(en parametre) est plus que 0
  18. if(heure > 0)
  19. {
  20. //A chaque 1 heure(en parametre), la seconde absolu gagne 3600
  21. while(heure > 0)
  22. {
  23. heure -= 1;
  24. m_secondeAbsolu += 3600;
  25. }
  26. }
  27. //Si la minute(en parametre) est plus grand que 0
  28. if(minute > 0)
  29. {
  30. //A chaque 1 minute(en parametre), la seconde absolu gagne 60.
  31. while(minute > 0)
  32. {
  33. minute -= 1;
  34. m_secondeAbsolu += 60;
  35. }
  36. }
  37. //Rajouter le nombre de seconde dans la seconde absolu
  38. m_secondeAbsolu += seconde;
  39. balancer();
  40. }
  41.  
  42. void Temps::balancer()
  43. {
  44. if(m_seconde > 60)
  45. {
  46. while(m_seconde > 60)
  47. {
  48. m_seconde -= 60;
  49. m_minute += 1;
  50. }
  51. }
  52. if(m_minute > 60)
  53. {
  54. while(m_minute > 60)
  55. {
  56. m_minute -= 60;
  57. m_heure += 1;
  58. }
  59. }
  60. if(m_heure > 24)
  61. {
  62. while(m_heure > 24)
  63. {
  64. m_heure -= 24;
  65. m_jour += 1;
  66. }
  67. }
  68. if(m_jour > 7)
  69. {
  70. while(m_jour > 7)
  71. {
  72. m_jour -= 7;
  73. m_semaine += 1;
  74. }
  75. }
  76. }
  77.  
  78. int Temps::get_secondeAbsolu() const
  79. {
  80. return m_secondeAbsolu;
  81. }
  82.  
  83. Temps Temps::operator+(Temps const& a)
  84. {
  85. m_secondeAbsolu += a.get_secondeAbsolu();
  86. balancer();
  87. return m_secondeAbsolu;
  88. }
  89.  
  90. Temps Temps::operator+=(const Temps& a)
  91. {
  92. m_secondeAbsolu += a.get_secondeAbsolu();
  93. balancer();
  94. return *this;
  95. }
  96.  
  97. void Temps::afficher() const
  98. {
  99. if(m_semaine > 0)
  100. {
  101. cout << m_semaine << " semaine(s) ";
  102. }
  103. if(m_jour > 0)
  104. {
  105. cout << m_jour << " jour(s) ";
  106. }
  107. if(m_heure > 0)
  108. {
  109. cout << m_heure << " heure(s) ";
  110. }
  111. if(m_minute > 0)
  112. {
  113. cout << m_minute << " minute(s) ";
  114. }
  115. cout << m_seconde << " seconde(s) " << endl;
  116. }


-------------------------------------------------------------------------------------
main.cpp
  1. #include <iostream>
  2. #include "Temps.h"
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. Temps TempsX(23,45,56);
  8. Temps TempsY(67,187,555);
  9. Temps total;
  10. total += TempsX;
  11. total.afficher();
  12. system("pause");
  13. return 0;
  14. }
  • djun a édité ce message
Contenus similaires
Meilleure solution
partage
|
Ta méthode operator+ est incorrect car tu modifies le contenu de la classe : si tu fait a = b + c, c'est l'équivalent de a = b.operator+(c), donc tu modifies b en plus de a.
De plus, dans ce même opérateur, tu retournes un entier (m_secondeAbsolu) qui est implicitement converti en Temps. Or le seul constructeur de ta classe qui fonctionne avec 1 seul entier est ton constructeur Temps(int heure = 0,int minute = 0, int seconde = 0). C'est donc lui qui est appelé en envoyant le nouveau m_secondeAbsolu dans la variable "heure" (le premier paramètre optionnel de type int).

Bref, tout ça pour te dire, que c'est operator+ qui ne fonctionne pas. S'il fonctionnait correctement, il devrait te retourner 0, comme l'autre.

Ton problème est que tu modifies m_secondeAbsolu, mais ta méthode balancer() n'utilise jamais cette variable, donc elle ne fait rien : m_heure, m_minute, m_seconde etc ne sont jamais modifiés.
  • Dreamcaster a sélectionné cette solution comme la meilleure réponse
  • Commenter cette solution |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS