cpp - 具有纯虚、普通函数、静态变量和友元类的类 [已关闭]

cpp - class that has pure virtual, normal function, static variables and friend class [closed]

提问人:Yaniv G 提问时间:9/3/2022 最后编辑:Yaniv G 更新时间:9/3/2022 访问量:71

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

去年关闭。

创建一个包含以下内容的类是否有意义:

  • 纯虚函数
  • 以及虚拟功能
  • 还有常规方法
  • 和静态函数
  • 和友元类声明

我是从“设计实践”的角度来问的。

在不让你感到疲惫的情况下,我有一些东西看起来有点像下面的类:

class CommonMessage {
protected:
   struct CommonHeader hdr;
   static const int hdrSize = sizeof(CommonHeader);
   friend class Parser; // parser show call serializeHdr() on an incoming buffer
public:
   bool desrializeHdr(uint8_t *buf, uint32_t offset);    // regular method
   virtual serializePayload(uint8_t *buf, uint32_t offset) = 0;
   virtual deSerializePayload(uint8_t *buf, uint32_t offset) = 0;
   
}

我的问题基本上是:

  1. 一旦你拥有了一个纯虚拟的,你就不应该(即良好的做法)包含常规方法和/或静态函数/变量或声明外部友元类,这是真的吗?

就目前而言,上面的例子正是我所需要的: 我可以创建具有 hdr 的派生类,以及一个不同的类解析器(声明为“friend”),它可以根据特定的状态机解析任何流(必须熟悉 CommonMessage 类,例如 headerSize 等),所以这个建议的实现可以完成这项工作。

  1. 这是一个好的做法吗,如果不是,你会建议改变什么?或者我应该遵循什么准则?或者在这种情况下,我应该遵循任何经验法则吗?(例如,不要在同一类中混合 A 和 B)。
C++ 静态方法 好友 pure-virtual

评论

0赞 The Dreams Wind 9/3/2022
规则有例外。如果我们用 Java 来说话,纯虚类是描述 C++ 中接口的手段,而部分纯类是引入抽象类的工具。许多语言允许同时做这两件事,C++也不例外。如果你在这里不需要接口,而是一个抽象类,那么代码会按照你的要求完成,我认为这没有问题。
0赞 user4581301 9/3/2022
一般阅读:C++ 核心指南

答:

1赞 bitmask 9/3/2022 #1

这通常被认为是代码异味的原因是,它看起来像是通过使用多态性进行代码重用。但多态性并不是为了代码重用。模板是。

所以,首先,如果你有一个具有纯虚拟成员函数且没有虚拟析构函数的类。该类可能不应有任何虚拟成员。

一般来说,如果可以,请尝试使用模板。在你的情况下,我可能会做的是有一个知道如何序列化给定有效负载的东西(甚至可能有效负载本身也知道这一点)。然后,将消息类型模板插入在一起,该模板知道如何将有效负载序列化与标头序列化一起插入。

如果只能在运行时决定必须处理的有效负载,请尽可能多地提取调度并尽早实例化正确的类型。这可能意味着您必须为大多数中间步骤传递模板参数。

话虽如此,在某种程度上,您可能会过于担心遵守一些严格的设计要求。大多数准则都有例外。