做静态类对象时遇到一个报错怎么也找不出来,然后在网上参考了了相关代码,不知怎么的就改对了。感觉很神奇,但是自己还是不是很理解,也没有找到类似的解释。
以下是ac代码:`
#include<iostream>
#include<cstring>
using namespace std;
int isLeapYear(int year) {//判断是否是闰年
return ((year%4==0) && (year%100!=0)||year%400==0);
}
int yeard(int y){//返回该年的天数
if (isLeapYear(y)){
return 366;
}else{
return 365;
}
}
struct Date0{
int year;
int month;
int day;
};
int monthx(int m1,int y1) {//返回该月的天数
int num;
switch(m1) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
num=31;
break;
case 2:
num=yeard(y1)-337;
break;
default:
num = 30;
break;
}
return num;
}
class Date {
public:
Date(int d = 0, int m = 0, int y = 0,int d1=1,int m1=1,int y1=1901) {
day=d;
month=m;
year=y;
default_date.day=d1;
default_date.month=m1;
default_date.year=y1;
} //构造函数
int get_day() const {
return day;
} // 返回day
int get_month() const {
return month;
} //返回month
int get_year() const {
return year;
} // 返回year
static void set_default(int a, int b, int c) {
default_date.day=a;
default_date.month=b;
default_date.year=c;
}
//设置default_date
static int get_default_day() {
return default_date.day;
} //返回缺省day
static int get_default_month(){
return default_date.month;
} //返回缺省month
static int get_default_year(){
return default_date.year;
} //返回缺省year
Date & add_year(int n) {
year+=n;
return *this;
} //加n年
Date & add_month(int n) {
int remain=n;
while(remain>0){
month++;
remain--;
if(month==13){
month=1;
year++;
}
}
return *this;
}//加n月,考虑超过12月
Date & add_day(int n) {
int remain=n;//还剩的天数
//最后加天数
while(remain>0){
day++;
remain--;
if(day==monthx(month,year)+1){//进位
day=1;
month++;
}
if(month==13){//进位
month=1;
year++;
}
}
return *this;
}//加n天,考虑进位月和年,考虑闰年
private:
int day, month, year;
static Date default_date; //初始化为 1901年1月1日
};
Date Date::default_date=Date(1,1,1901);
int main() {
char type[101];
int day,mon,year;
int addday,addmon,addyear;
while(cin>>type) {
if(strcmp(type,"Date") == 0) {
cin>>day>>mon>>year;
Date mydate(day,mon,year);
cin>>addday>>addmon>>addyear;
mydate.add_day(addday).add_month(addmon).add_year(addyear);
cout << mydate.get_day() << " " << mydate.get_month() << " " << mydate.get_year() << endl;
}
else if(strcmp(type,"defaultDate") == 0) {
cout << Date::get_default_day() << " " << Date::get_default_month() << " " << Date::get_default_year() << endl;
}
else if(strcmp(type,"setdefaultDate") == 0) {
cin>>day>>mon>>year;
Date::set_default(day,mon,year);
cout << Date::get_default_day() << " " << Date::get_default_month() << " " << Date::get_default_year() << endl;
}
}
return 0;
}
其中判断是否为闰年的代码部分让我耳目一新:
int isLeapYear(int year) {//判断是否是闰年
return ((year%4==0) && (year%100!=0)||year%400==0);
}
int yeard(int y){//返回该年的天数
if (isLeapYear(y)){
return 366;
}else{
return 365;
}
}
尤其要注意,静态成员对象只能调用静态成员函数,这也是我之前一直改的地方,忘记在void set_default(int a, int b, int c)
前面加上static了