gpt4 book ai didi

c++ - 在 C++ 类中包装 Winsock 函数

转载 作者:行者123 更新时间:2023-11-30 02:03:56 25 4
gpt4 key购买 nike

我见过一些人创建如下“is-a”关系:

class TCPClient : public Socket
{
public:
TCPClient(const std::string& host, unsigned short port);
};

其中 Socket 类实现了 Winsock 函数,如 Connect()、Close()、Bind() 等。

示例:

但这对我这个套接字编程的新手来说并不自然。

上面的层次结构是否比下面的“有一个”层次结构更符合逻辑?

class TCPClient
{
public:
TCPClient(const std::string& host, unsigned short port);
....
private:
Socket m_socket;
};

最佳答案

TCPClient 使用一个套接字或有一个套接字,但它本身不是一个套接字,并且您通常不会期望能够在需要套接字的任何地方替换 TCPClient。因此,公共(public)继承没有意义。

可以在这种情况下使用私有(private)继承,但是(至少在典型情况下)它可能也没有多大意义。当基类提供至少一个您计划在子类中重写的虚函数时,私有(private)继承才有意义。如果你有一个虚函数并且需要覆盖它,你别无选择,只能使用继承。不过,我不希望 Socket 类具有虚函数;这通常不适用于此处。

这基本上引出了您的第二个解决方案:TCPClient 应该包含一个 Socket 实例,而不是完全使用继承。

不过,我应该补充一点,您展示的 Socket 类似乎将实际套接字的概念与地址的概念混为一谈。我的第一个套接字类(年前)就是这样工作的,但从那时起我就得出结论,这并不是一个真正理想的设计。我已经确信将地址的概念与套接字本身分开是值得的。虽然我的设计没有那么复杂,但我发现有趣的是,我想出的东西看起来几乎就像是 Boost ASIO 的原型(prototype)。它更小更简单,但很多基本思想大体上还是很相似的。

这引出了我的下一个建议:看看 Boost ASIO。缺乏一个相当具体的理由不这样做,这是我在大多数新代码中建议(并且通常使用)的方法。虽然(正如我上面所说的)这些年来我写了几个套接字类,但我已经有一段时间没有在很多(任何?)新代码中使用它们中的任何一个了——与 ASIO 相比,它们实际上只有两个可能的优势.第一个只适用于我:因为我在 ASIO 存在之前编写和使用它们,所以我已经理解它们以及它们是如何工作的。第二个可能类似:至少对我来说,它们看起来更小、更简单(但是,同样,这可能只是因为我先使用了它们)。即便如此,(例如)使用其他人已经理解的东西的优势很容易胜过那些。

关于c++ - 在 C++ 类中包装 Winsock 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11282656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com