我们在阅读muduo库源码时可以看到
这个noncopyable类将自身的拷贝构造和重载赋值操作给delete了
所以其它类在将此类作为基类时也无法进行拷贝构造和重载赋值操作
直接上源码
#pragma once
class noncopyable
{
public:
noncopyable(const noncopyable &) = delete;
void operator=(const noncopyable &) = delete;
protected:
noncopyable() = default;
~noncopyable() = default;
};
TimeStamp.h
#pragma once
#include <time.h>
#include <string>
class TimeStamp
{
public:
TimeStamp();
TimeStamp(int64_t microSecondsSinceEpoch);
~TimeStamp() {}
static TimeStamp now();
std::string toString();
private:
int64_t microSecondsSinceEpoch_;
};
#include "TimeStamp.h"
#include <iostream>
TimeStamp::TimeStamp() : microSecondsSinceEpoch_(0) {}
TimeStamp::TimeStamp(int64_t microSecondsSinceEpoch) : microSecondsSinceEpoch_(microSecondsSinceEpoch) {} // 带参的构造函数
TimeStamp TimeStamp::now()
{
return TimeStamp(time(NULL)); // time函数返回一个用秒计数的时间,通过构造函数直接返回一个TimeStamp类实例
}
std::string TimeStamp::toString()
{
char buff[128] = {0};
tm *time_now = localtime(µSecondsSinceEpoch_);
snprintf(buff, 128, "%4d年%02d月%02d日%02d:%02d:%02d",
time_now->tm_year + 1900,
time_now->tm_mon + 1,
time_now->tm_mday,
time_now->tm_hour,
time_now->tm_min,
time_now->tm_sec);
return buff;
}
这个头文件实现了返回当前时间
可以在main函数中测试代码为
int main()
{
std::cout<<TimeStamp::now().toString();
}
now函数必须设置为静态函数否则无法域解析::
InetAddress类
#pragma once
#include <string>
#include <netinet/in.h>
class InetAddress
{
public:
InetAddress(int port, std::string ip = "127.0.0.1");
InetAddress(sockaddr_in &addr) : addr_(addr) {}
std::string toIp() const;
std::string toIpPort() const;
int toPort() const;
private:
sockaddr_in addr_;
};
#include "InetAddress.h"
#include <string.h>
#include <arpa/inet.h>
InetAddress::InetAddress(int port, std::string ip)
{
memset(&addr_, 0, sizeof(addr_));
addr_.sin_family = AF_INET;
addr_.sin_addr.s_addr = inet_addr(ip.c_str());
addr_.sin_port = htons(port);
}
std::string InetAddress::toIp() const
{
char buff[64] = {0};
inet_ntop(AF_INET, &addr_.sin_addr, buff, sizeof(buff));
return buff;
}
std::string InetAddress::toIpPort() const
{
char buff[64] = {0};
inet_ntop(AF_INET, &addr_.sin_addr, buff, sizeof(buff));
int len = strlen(buff);
sprintf(buff + len, ":%d", ntohs(addr_.sin_port));
return buff;
}
int InetAddress::toPort() const
{
return ntohs(addr_.sin_port);
}
#include <iostream>
int main()
{
InetAddress addr(9190);
std::cout << addr.toIpPort();
}
这个类实现了将用户传来的ip和port封装到结构体sockaddr_in中,并可以调用类方法来return相关的ip或port。
值得注意的是在toIpPort函数中,strlen不可以替换为sizeof,因为已经提前将buff全部置为0,sizeof默认将所有0即空字符也进行计数。
看看效果
成功返回默认的IP地址及传入的端口