实现tiny-muduo(部分完成)

我们在阅读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(&microSecondsSinceEpoch_);
    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地址及传入的端口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

"情歌被打败"

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值