📄 c_12_1.cpp
字号:
#include "stdafx.h"
#include <iostream>
//#include <string>
using namespace std;
class Date {
public:
Date():year(0),month(0),day(0){}
friend ostream& operator << (ostream&, Date&);
friend istream& operator >> (istream&, Date&);
int year,month,day;
};
class input_error{
public:
virtual void doit ()=0;
};
class year_error : public input_error{
private:
Date& temp;
public:
year_error(Date& d)
:temp(d)
{}
void doit()
{ while ( !cin)
{ cin.clear();
cin.ignore(90,'\n');
cout << "输入错误,请重新输入年份"<<":";
cin >> temp.year;
}
}
};
class month_error : public input_error{
private:
Date& temp;
public:
month_error(Date& d)
:temp(d)
{}
void doit()
{ while ( !cin||(temp.month>12)||(temp.month<=0))
{ cin.clear();
cin.ignore(90,'\n');
cout << "输入错误,请重新输入月份"<<":";
cin >> temp.month;
}
}
};
class day_error : public input_error{
private:
Date& temp;
public:
day_error(Date& d)
:temp(d)
{}
void doit()
{ while ( !cin||(temp.day>31)||(temp.day<=0))
{ cin.clear();
cin.ignore(90,'\n');
cout << "输入错误,请重新输入日期"<<":";
cin >> temp.day;
}
}
};
ostream& operator << (ostream& out, Date& date)
{ out << date.year << "年" << date.month << "月" << date.day << "日"<<endl;
return out;
}
istream& operator >> (istream& in, Date &date)
{ try {
cout << "输入年份:";
in >> date.year;
if (!in) throw year_error(date);
}
catch (input_error &obj)
{obj.doit();}
try {
cout << "输入月份:";
in >> date.month;
if (!in||(date.month>12)||(date.month<=0)) throw month_error(date);
}
catch (input_error &obj)
{obj.doit();}
try {
cout << "输入日期:";
in >> date.day;
if (!in||(date.day>31)||(date.day<=0)) throw day_error(date);
}
catch (input_error &obj)
{obj.doit();}
return in;
}
void main()
{ Date date1;
cin >> date1;
cout << date1;
cin.get(); cin.get(); //等待结束,以便调测程序,可以删除
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -