- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我见过一些人创建如下“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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!