Задание звучит так:
Немного удивило требование к двум функциям-членам input и output, но суть не в этом.Определите класс Month как абстрактный тип данных для информации о месяце. Он должен содержать одну переменную-член типа int, представляющую месяц (1 для янв, 2 для фев и т.д.). В его состав должны входить такие элементы: конструктор, устанавливающий месяц по первым
трем буквам его названия, которые заданы в трех аргументах; конструктор, устанавливающий месяц по его целочисленному номеру, который задан в аргументе; используемый по умолчанию конструктор; функция-член input, считывающая порядковый номер месяца, и функция-член input, считывающая первые три буквы названия месяца; функция-член output, выводящая порядковый номер месяца, и функция-член output, выводящая первые три буквы названия месяца; функция-член,
возвращающая следующий месяц как значение типа Month. Функции-члены input и output имеют по одному формальному параметру типа потока. Включите определение этого класса в тестовую программу
С этой задачей я справился.
Далее идет продолжение программы:
Вобщем переделал класс. И когда я передаю конструктором числовое значение месяца для преобразования его в первые три буквы месяца, у меня срабатывает проверка на корректность ввода ((num_mon < 1) || (num_mon > 12)), хотя конструктор передает верное число, и в итоге картина Репина "Приплыли".Переопределите реализацию класса Month, описанного в предыдущем проекте. На этот раз месяц должен быть реализован в виде трех переменных-членов типа char, в которых хранятся первые три буквы названия месяца. Включите определение данного класса в тестовую программу.
Код класса (интерфейс + реализация):
Код: Выделить всё
//Класс для информации о месяце
class Month
{
public:
Month(char let1, char let2, char let3);
//Инициализирует значение месяца по первым 3 буквам его названия
Month(int num_mon);
//Инициализирует значение месяца равным num_mon
Month();
//Инициализирует значение месяца равным Jan
void input(istream& ins = cin);
void output(ostream& outs = cout);
int get_month();
//Возвращает порядковый номер месяца по первым 3 буквам
//(Jan - 1, Feb - 2...)
Month next_month();
//Возвращает следующий номер месяца.
private:
char mon1;
char mon2;
char mon3;
};
=======
Month::Month(char let1, char let2, char let3): mon1(let1), mon2(let2), mon3(let3)
{
}
//ВОТ ЭТОТ КОНСТРУКТОР ДАЕТ СБОЙ
Month::Month(int num_mon)
{
if((num_mon < 1) || (num_mon > 12))
{
cout << "Error.\n";
//exit(1);
}
else
if(num_mon == 1)
{
mon1 = 'J';
mon2 = 'a';
mon3 = 'n';
}
if(num_mon == 2)
{
mon1 = 'F';
mon2 = 'e';
mon3 = 'b';
}
...
if(num_mon == 12)
{
mon1 = 'D';
mon2 = 'e';
mon3 = 'c';
}
}
Month::Month():mon1('J'), mon2('a'), mon3('n')
{
}
int Month::get_month()
{
if((mon1 == 'J') && (mon2 == 'a') && (mon3 == 'n'))
{
return 1;
}
if((mon1 == 'F') && (mon2 == 'e') && (mon3 == 'b'))
{
return 2;
}
...
if((mon1 == 'D') && (mon2 == 'e') && (mon3 == 'c'))
{
return 12;
}
}
Month Month::next_month()
{
if(get_month() == 1)
{
mon1 = 'F';
mon2 = 'e';
mon3 = 'b';
return (mon1 + mon2 + mon3);
}
if(get_month() == 2)
{
mon1 = 'M';
mon2 = 'a';
mon3 = 'r';
return (mon1 + mon2 + mon3);
}
...
if(get_month() == 12)
{
mon1 = 'J';
mon2 = 'a';
mon3 = 'n';
return (mon1 + mon2 + mon3);
}
}
//Используем библиотеку классов isostream
void Month::input(istream& ins)
{
cout << "What is the month now (enter first 3 letters): ";
ins >> mon1 >> mon2 >> mon3;
}
void Month: :o utput(ostream& outs)
{
cout << "Month is: " << mon1 << mon2 << mon3 << endl;
}
Код: Выделить всё
int main()
{
Month mont1, mont2('A', 'u', 'g'), mont3(11);
mont1.output();
mont2.output();
mont2.next_month();
mont2.output();
mont3.output();
return 0;
}
В реальности:Month is: Jan
Month is: Aug
Month is: Sep
Month is: Nov
Заранее спасибо за помощь.Month is: Jan
Month is: Aug
Error.
Month is: Sep
Month is: Nov
P.S> Прошу камнями не бросаться, учусь. Массивы, указатели еще только предстоит изучить (через пару глав), следовательно задача решаема без них (это на всякий случай, если будут вопросы).