2017-10-15 5 views
-1

J'ai un constructeur dans lequel j'essaie de dépasser le temps. Donc, si l'utilisateur entre 63 secondes, les 60 secondes sont transmises à la minute car il est impossible d'avoir 63 secondes dans une minute. C'est ce que j'ai. J'ai besoin d'aide avec la section commentée.Essayer de dépasser le temps dans un constructeur

Time::Time(int hours, int minutes, int seconds, int millis) { 

     /*int add_millis = millis; 
     minutes -= add_millis*60000 ; 
     millis += add_millis;*/ 

     int add_seconds = millis/1000; 
     millis -= add_seconds * 1000; 
     seconds += add_seconds; 

     int add_minutes = seconds/60; 
     seconds -= add_minutes * 60; 
     minutes += add_minutes; 

     int add_hours = minutes/60; 
     minutes -= add_hours * 60; 
     hours += add_hours; 

     hours %= 24; 
+0

Il y a un opérateur de module en C++. ... – StoryTeller

+0

Je suis familier avec cela, mais je ne pense pas que cela aide dans cette situation. –

+0

De quel type d'aide avez-vous besoin avec la section commentée? Y at-il une entrée qui n'est pas correctement gérée par la fonction telle quelle? –

Répondre

0

Premièrement, vous devez décider si le temps est une chose. Cela ne semble pas être dans votre exemple. Ce que vous voulez au lieu d'un objet est une fonction, qui est une meilleure représentation d'une «action» que vous effectuez sur les «choses». Votre constructeur ne semble opérer que sur des variables que vous leur passez par valeur (c'est-à-dire aucune variable membre, aucune référence), ce qui nous amène au second point: toute modification apportée aux paramètres ne sera visible que localement. Vous devez passer par référence ou les stocker quelque part (c'est-à-dire les variables membres). Troisièmement: vous voulez mettre en cascade vos changements de plus petites à plus grandes unités de temps, de sorte que vous ne devez emballer chacune d'entre elles qu'une seule fois.

Dans cet esprit, votre fonctionnalité mise en œuvre en fonction des paramètres passés par référence:

#include <cassert> 

void ValidateTime(int& hours, int& minutes, int& seconds, int& ms) 
{ 
    assert(ms >= 0); 
    assert(seconds >= 0); 
    assert(minutes >= 0); 
    assert(hours >= 0); 

    int add_seconds = ms/1000; 
    ms %= 1000; 

    seconds += add_seconds; 
    int add_minutes = seconds/60; 
    seconds %= 60; 

    minutes += add_minutes; 
    int add_hours = minutes/60; 
    minutes %= 60; 

    hours += add_hours; 
    // TODO: exercise for the reader: roll your hours into days. 
} 

Exemple d'utilisation:

int main() 
{ 
    int hours = 1; 
    int minutes = 125; 
    int seconds = 63; 
    int ms = 54100; 
    ValidateTime(hours, minutes, seconds, ms); 

    std::cout << "hours: " << hours << ", minutes: " << minutes << ", seconds: " << seconds << ", ms: " << ms; 
} 

Prints hours: 3, minutes: 6, seconds: 57, ms: 100