作为一个宏大的、功能健全的muduo库,考虑的肯定是众多情况是否可以高效满足;而作为学习者,我们需要抽取其中的精华进行简要实现,这要求我们足够了解muduo库。
做项目 = 模仿 + 修改,不要担心自己学了也不会写怎么办,重要的是积累,学到了这些方法,如果下次在遇到通用需求的时候你能够回想起之前的解决方法就够了。送上一段话!
对于Timestamp类,它其实就只有一个功能,提供localtime,所以代码相对比较简单。
在Timestamp中,我们使用一个int64_t类型的变量来存储时间。因为我们会调用time函数来获取当前时间,该函数返回time_t实际上是一个long int类型,在c++11的变量定义中是int64_t。
对于我们的函数,首先肯定是构造函数。
这里用到了隐式构造函数,默认返回0值,比较重要的是带参构造,这里我用了explicit可以防止隐式转换,如果发生了隐式转换,explicit是会产生报错的。
其次是获取当前时间的函数。
这里调用了Timestamp带参构造函数,获得了int64_t类型的当前时间。注意,该函数必须是static修饰的,它是要返回Timestamp类对象,所以肯定是属于类而非某个类对象的静态函数。
这里定义toString,将int64_t类型转换成char*打印出来。
其中使用到了tm时间结构体,以及localtime函数,大家可以着重看看该行代码,记忆这种获取当前时间的写法。
之后使用snprinf将tm中已经存好的时间信息输出到buf中,最后返回buf。snprintf相比于sprintf更安全,它指定了buf读入的最大长度,超过该长度就会将超过部分删除而只将没超过该长度的部分放入buf中。
//Timestamp.h
#pragma once
#include <iostream>
#include <string>
class Timestamp {
public:
Timestamp() : microSecond_(0) {}
explicit Timestamp(int64_t microSecond) : microSecond_(microSecond) {}
static Timestamp now();
std::string toString() const;
private:
int64_t microSecond_;
};
//Timestamp.cpp
#include "Timestamp.h"
Timestamp Timestamp::now() {
return Timestamp(time(nullptr));
}
std::string Timestamp::toString() const {
char buf[128] = {0};
tm* my_tm = localtime(µSecond_);
snprintf(buf, sizeof buf, "%d/%d/%d %d:%d:%d", my_tm->tm_year + 1900, my_tm->tm_mon + 1, my_tm->tm_mday, my_tm->tm_hour, my_tm->tm_min, my_tm->tm_sec);
return buf;
}
以上就是时间Timestamp类的相关介绍,以及我在进行项目重写的时候遇到的一些问题,和我自己的一些心得体会。发现写博客真的会记录好多你的成长,而且对于一个好的项目,写博客也是证明你确实有过深度思考,并且在之后面试或者工作时遇到同样的问题能够进行复盘的一种有效的手段。所以,希望uu们也可以像我一样,养成写博客的习惯,逐渐脱离菜鸡队列,向大佬前进!!!加油!!!
也希望我能够完成muduo网络库项目的深度学习与重写,并在功能上能够拓展。也希望在完成这个博客系列之后,能够引导想要学习muduo网络库源码的人,更好地探索这篇美丽繁华的土壤。致敬chenshuo大神!!!
鉴于博主只是一名平平无奇的大三学生,没什么项目经验,所以可能很多东西有所疏漏,如果有大神发现了,还劳烦您在评论区留言,我会努力尝试解决问题!