Попытка перерасхода времени в конструкторе

У меня есть конструктор, в котором я пытаюсь сократить время. Таким образом, если пользователь вводит 63 секунды, эти 60 секунд переходят в минуты, потому что невозможно иметь 63 секунды в минуту. Это то, что у меня есть. Мне нужна помощь с комментариями.

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;

-1

Решение

Во-первых, вам нужно решить, является ли Время «вещью». Это не похоже на ваш пример. Вместо объекта вам нужна функция, которая лучше отражает «действие», которое вы выполняете над «вещами».

Кажется, ваш конструктор работает только с переменными, которые вы передаете им по значению (то есть без переменных-членов, без ссылок), что подводит нас ко второму пункту: любое изменение параметров, которое вы вносите, будет видно только локально. Вам нужно передать по ссылке или иным образом сохранить их где-нибудь (т.е. переменные-члены).

В-третьих: вы хотите перевести ваши изменения с меньшего на большее время, поэтому вам нужно только обернуть каждый из них один раз.

Имея это в виду, ваша функциональность реализована как функция с параметрами, передаваемыми по ссылке:

#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.
}

Пример использования:

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;
}

Печать hours: 3, minutes: 6, seconds: 57, ms: 100

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]