我们有班级Ip::Address
和Ip::Endpoint
。
第一个设计理念。
Ip::Address
Ip::Address::Address(const std::string& stringRepresentation)
此类将在内部表示为in_addr
或in6_addr
。
Ip::Endpoint
Ip::Endpoint::Endpoint(const Ip::Address& address, const std::uint16_t port)
此类将包含Ip::Address
,并在内部表示为sockaddr_in
或sockaddr_in6
。
这是我提出的设计,但我并不满意。原因如下。我们来看看IPv4案例吧。 Ip::Endpoint
内部表示为sockaddr_in
,其中包含in_addr
。由于Ip::Endpoint
还包含内部表示为Ip::Address
的{{1}},in_addr
结构会在in_addr
内显示两次。
第二个设计理念。
Ip::Endpoint
此类将在内部表示为Ip::Address
Ip::Address::Address(const std::string& stringRepresentation)
或sockaddr_in
。
sockaddr_in6
此类将包含Ip::Endpoint
Ip::Endpoint::Endpoint(const Ip::Address& address, const std::uint16_t port)
并使用其内部表示在内部表示自己 - Ip::Address
将依赖Ip::Endpoint
(Ip::Address::Internal
或sockaddr_in
)
此方法将消除sockaddr_in6
的两个in_addr
/ in_addr6
结构。但它也会使Ip::Endpoint
'内部表示'太大'。 Ip::Address
只需要Ip::Address
,但不需要in_addr
。
你有什么想法?