小白C++入坑学废之旅(三)

今天开始新的一期自虐行为,练习250测中的输入一个数字,判断并输出对应的星期名字的习题。然后我又跳了。因为说实话c++11以下的版本好像很少有像C#里面的DateTime和Java里的LocalDate以及LocalDateTime这样简单好用的时间胶囊类。所以这次打算自己写一个类似的c++版的时间胶囊类:

  1. 可以获取当前本地的最新时间。
  2. 可以通过millisecond构建时间。
  3. 可以获取时间中的year, month以及day部分数值,甚至hour, minute和second等。
  4. 可以format输出特定的时间戳字符串。
  5. 可以parse特定的时间戳字符串并构建时间。
  6. 可以对year,month, day,hour,minute,second各刻度上进行加减算术运算。
  7. 可以判断两个时间的早晚。

在上面的需求中,我预计可以了解c++关于类,抽象,继承以及虚函数等面向对象的概念有一个全面的实践。

首先需要定义一个抽象概念就是时间刻度。Year,month,day,hour,minute和second都是一个时间刻度。具体的定义如下:

class TimeScale
    {

    protected:
        const TimeScale* parent = nullptr;
        const TimeScale* child = nullptr;
        int value;
        int max;

        /// @brief 设置值
        /// @param result
        virtual void setValue(int result);

        /// @brief 处理进位
        /// @param result
        virtual void handleCarry(int carry);

        /// @brief 重新检查子刻度,处理特殊逻辑
        virtual void recheckChild();

    public:
        TimeScale(int value, int max);

        TimeScale(const TimeScale*parent, int value, int max);

        /// @brief 添加子类
        /// @param child 
        void setChild(const TimeScale* child);

        virtual void operator+(const int i);

        virtual void operator-(const int i);

        /// @brief 获取当前值
        /// @return 
        const int getValue();

        /// @brief 获取高级刻度
        /// @return 
        const TimeScale* getParent(){
            return parent;
        }

        virtual ~TimeScale();
    }

其中声明了parent和child分别构建一个类似上下级的刻度链,用于通过handleCarry, recheckChild处理单位进位逻辑和特殊时间影响。例如,如果是12月31日,我们在时间上加上一天,那么day会变为1,同时进位month再加上1.而在month加上1后,会变为1,又会进位year。而像month从其他月份变为2月份,那么就需要对day>28进行特殊处理。

暂时目前挖的坑是这样的,后续要怎么跳还得再斟酌一下。另外可能还要对时间刻度在copy等操作上进一步补全用于支持整个时间的拷贝以及还有大小比较操作等。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值