Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2013, 16:41   #1
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию Задание с классами.

Стоит задача написать класс с 3 полями (секунды, минуты, часы) и метод, который складывает два объекта этого класса. Работает все кроме одного - не обнуляются секунды и минуты (т.е. я хочу сделать так, чтобы если например 59 секунд, то минуты бы инкриментировались, а секундам присваивался 0). В чем ошибка?

Код:
#include <iostream>

using namespace std;

class Time
{
private:
	int sec;
	int min;
	int hr;
public:
	Time() : sec(0), min(0), hr(0) {}
	Time(int h, int m, int s) : sec(s), min(m), hr(h) {}
	void display() const { cout << hr << ":" << min << ":" << sec << endl; }
	Time add(const Time);
};

Time Time::add(const Time t2)
{
	Time temp;
	temp.sec += sec + t2.sec;
	if(sec >= 59)
	{
		temp.sec = 0;
		temp.min++;
	}
	temp.min += min + t2.min;
	if(min >= 59)
	{
		temp.min = 0;
		temp.hr++;
	}
	temp.hr += hr + t2.hr;
	return temp;
}

int main()
{
	setlocale(LC_ALL,"Russian");
	Time t1(12, 30, 30);
	Time const t2(12, 30, 30);
	Time t3;
	t3 = t1.add(t2);
	cout << "t1 = "; t1.display();
	cout << "t2 = "; t2.display();
	cout << "t3 = "; t3.display();
	system("pause");
	return 0;
}
Dima-War вне форума Ответить с цитированием
Старый 11.04.2013, 17:33   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1)
Код:
Time Time::add(const Time t2)
const в данном случае малоосмысленно: аргумент передаётся по значению, так что оригинал и так не изменится.

2) Почему у Вас условия if проверяют sec, а не temp.sec? И кто сказал, что 38 секунд + 46 секунд = 1 минута 0 секунд?
Abstraction вне форума Ответить с цитированием
Старый 11.04.2013, 18:00   #3
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
2) Почему у Вас условия if проверяют sec, а не temp.sec? И кто сказал, что 38 секунд + 46 секунд = 1 минута 0 секунд?
Да, упустил этот момент, спасибо. А по поводу const, в задании было предложено все возможные методы сделать константными.
Dima-War вне форума Ответить с цитированием
Старый 11.04.2013, 18:19   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Да, упустил этот момент, спасибо. А по поводу const, в задании было предложено все возможные методы сделать константными.
Осталось узнать, что такое константный метод. Прототип Time::add должен выглядеть так:
Код:
Time add(const Time&) const;
Abstraction вне форума Ответить с цитированием
Старый 11.04.2013, 20:49   #5
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Код:
Time add(const Time&) const;
Вот это я и имел ввиду. Ну и в книжке, которую я читаю (Объектно-ориентированное программирование в С++, Р.Лафоре) они так и называются.
И еще такой вопрос. Обязательно ли использовать ссылку (const Time&) или можно сделать как сделал я?
Dima-War вне форума Ответить с цитированием
Старый 11.04.2013, 21:07   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Dima-War Посмотреть сообщение
Вот это я и имел ввиду. Ну и в книжке, которую я читаю (Объектно-ориентированное программирование в С++, Р.Лафоре) они так и называются.
И еще такой вопрос. Обязательно ли использовать ссылку (const Time&) или можно сделать как сделал я?
Ну если тебя устраивает, что у тебя каждый раз будет создаваться копия аргумента, что будет отжирать и память, и производительность - передавай по значению.


Если хочется писать экономичный и быстрый код, то все классы, размером свыше 8 байт передаются по ссылкам.

Если аргумент только для чтения - константная ссылка.
Если аргумент предполагается модифицировать - не константная ссылка.
_Bers вне форума Ответить с цитированием
Старый 11.04.2013, 21:09   #7
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Ну если тебя устраивает, что у тебя каждый раз будет создаваться копия аргумента, что будет отжирать и память, и производительность - передавай по значению.


Если хочется писать экономичный и быстрый код, то все классы, размером свыше 8 байт передаются по ссылкам.

Если аргумент только для чтения - константная ссылка.
Если аргумент предполагается модифицировать - не константная ссылка.
Ясно, спасибо.
Dima-War вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с классами АндрейBAN C# (си шарп) 4 17.12.2012 13:10
Запутаное задание задание с массивом.Буду очень благодарен. Riko1 Общие вопросы C/C++ 2 22.10.2011 10:23
работа с классами JinZh C++ Builder 2 20.04.2011 23:17
Работа с классами ImmortalAlexSan Помощь студентам 0 04.12.2010 14:07