一个简单的值类型data
只做了个大概内容,有些细节还没实现,程序如下:
#include<string>
using namespace std;
struct cache{
bool valid;
string rep;
};
class Data{
public:
enum Month{ jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec,};
class Bad_data{};
Data(int dd=0, Month mm=Month(0), int yy=0);
//check Data
int day() const {return d;}
Month month() const {return m;}
int year() const{return y;}
string string_rep() const; // string show
void char_rep() const; // c-string show
static void set_default(int,Month,int);
//rewrite Data
Data& add_year(int n);
Data& add_month(int n);
Data& add_day(int n);
//reload
bool operator!=(Data a,Data b);
bool operator<(Data a,Data b);
bool operator>(Data a,Data b);
Data& operator++(Data&d);
Data& operator--(Data&d);
Data& operator+=(Data&d);
Data& operator-=(Data&d);
Data& operator+(Data&d);
Data& operator-(Data&d);
private:
cache *c;
bool cho;
void compute_cache_value() const;
int d,m,y;
static Data default_data;
};
//help fuction
int diff(Data a, Data b);
bool leapyear(int y)
{
int yy=y;
if(y%100 == 0)
yy = y/100;
if(yy%4 == 0)
return true;
return false;
}
Data next_saturday(Data d);
//define constrction function
Data::Data(int dd, Month mm, int yy)
{
if(yy == 0)
yy = default_data.year();
if(mm == 0)
mm = default_data.month();
if(dd == 0)
dd = default_data.day();
int max;
switch(mm){
case feb :
max = 28+leapyear(yy);
break;
case apr:
case jun:
case sep:
case nov:
max = 30;
break;
case jan:
case mar:
case may:
case jul:
case aug:
case oct:
case dec:
max = 31;
default:
throw Bad_data();
}
if( dd<1 || max<dd )
throw Bad_data();
y = yy;
m = mm;
d = dd;
}
Data& Data::add_year(int n)
{
if(n==0)
return *this;
if(n>0)
{
y+=n;
return *this;
}
if(n<0)
{
y-=n;
if(y==0)
throw Bad_data();
return *this;
}
}
Data& Data::add_month(int n)
{
if(n==0)
return *this;
if(n>0)
{
int delta_y = n/12;
int mm = m+n%12;
if(mm>12)
{
delta_y++;
mm-=12;
}
y+=delta_y;
m = Month(mm);
return *this;
}
//deal with minlus (n<0)
int de_y = (-n)/12;
int lef_y = (-n)%12;
int mm = 12-lef_y+m;
if(mm>12)
{
mm-=12;
de_y++;
}
y +=de_y;
m = Month(mm);
}
Data& Data::add_day(int n)
{
if(n==0)
return *this;
if(n>0)
{}
if(n<0)
{}
}
bool Data::operator != (Data a,Data b)
{
return (! ( (a.d == b.d )&&(a.m == b.m )&&(a.y == b.y) ) )
}
bool Data::operator < (Data a,Data b)
{
if(a.y<b.y)
return true;
if(a.y>b.y)
return false;
if(a.m<b.m)
return true;
if(a.m>b.m)
return false;
if(a.d<b.d)
return true;
if(a.d>b.d)
return false;
return false;
}
bool Data::operator >(Data a,data b)
{
}
Data& Data::operator ++(Data& d)
{
switch(d.m){
case jan:
case mar:
case may:
case jul:
case aug:
case oct:
if(d.d==31)
{
d.m++;`
d.d=1;
return *this;
}
d.m++;
return *this;
case apr:
case jun:
case sep:
case nov:
if(d.d==30)
{
d.m++;
d.d=1;
return *this;
}
d++;
return *this;
case dec:
if(d.d==31)
{
d.m= jan;
d.y++;
d.d=1;
return *this;
}
d.d++;
return *this;
case feb:
if((leapyear(d.y))&&(d.d==29))
{
d.m++;
d.d=1;
return *this;
}
if((!leapyear(d.y))&&(d.d ==28))
{
d.m++;
d.d=1;
return *this;
}
return *this;
}
}
string Data::string_rep()const
{
if(!c->valid)
{
compute_cache_value();
c->valid = true;
}
return c->rep;
}
还需要加工一下,只是个雏形。