一个简单的值类型data

 

 

                   一个简单的值类型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;

 }

 

 

 

 

还需要加工一下,只是个雏形。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值