void Date::fillDate(int d, Month m, int y) { // Ця умова спрацьовує рівно один раз, // оскільки першим створеним об’єктом стане // defaultDate, який буде створено // до початку виконання програми if(!defaultSet) { defaultSet=true; setDefault(); #ifndef NDEBUG cout<<"Data constructor defaultDate: "<<*this<<endl; #endif // Встановили дату за замовчуванням — і виходимо return; } // Тепер аналізуємо параметри: // неіснуючі (вони нульові) беремо // з дати за замовчуванням, // яка вже гарантовано була визначена _day=d? d :defaultDate._day; _month=m? m :defaultDate._month; _year=y? y: defaultDate._year; // Готуємося визначити кількість днів у місяці // 28, 29, 30 чи 31 int numberOfDays = numberOfDaysInMonth(_month); // Перевірка коректності дня і року if((_day<1)||(numberOfDays<_day)||(_year<0)) throw BadDate(_day, _month, _year); #ifndef NDEBUG cout<<"Data constructor: "<<*this<<endl; #endif };
/* * the constructor of Date, it'll throw a BadDate exception if * the input date is illegal. */ Date::Date(int dd, Month mm, int yy) { dd = dd ? dd : default_date.d; mm = mm ? mm : default_date.m; yy = yy ? yy : default_date.y; if (mm < jan || mm > dec) throw BadDate("incorrect month"); if (dd < 1 || dd > month_days(mm, yy)) throw BadDate("incorrect day"); d = dd; m = mm; y = yy; cache = new Cache(); cache->valid = false; }
//повертає кількість днів у місці у поточній даті int Date:: numberOfDaysInMonth(int month) { int numberOfDays= 0; switch(month) { // У лютому враховуємо високосний рік case feb: numberOfDays=28+leapYear(year()); break; case apr: case jun: case sep: case nov: numberOfDays=30; break; case jan: case mar: case may: case jul: case aug: case oct: case dec: numberOfDays=31; break; // Місяць виявився некоректним default: throw BadDate(_day, _month, _year); } return numberOfDays; }