提问人:Yaniv G 提问时间:9/3/2022 最后编辑:Yaniv G 更新时间:9/3/2022 访问量:71
cpp - 具有纯虚、普通函数、静态变量和友元类的类 [已关闭]
cpp - class that has pure virtual, normal function, static variables and friend class [closed]
问:
创建一个包含以下内容的类是否有意义:
- 纯虚函数
- 以及虚拟功能
- 还有常规方法
- 和静态函数
- 和友元类声明
我是从“设计实践”的角度来问的。
在不让你感到疲惫的情况下,我有一些东西看起来有点像下面的类:
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;
}
我的问题基本上是:
- 一旦你拥有了一个纯虚拟的,你就不应该(即良好的做法)包含常规方法和/或静态函数/变量或声明外部友元类,这是真的吗?
就目前而言,上面的例子正是我所需要的: 我可以创建具有 hdr 的派生类,以及一个不同的类解析器(声明为“friend”),它可以根据特定的状态机解析任何流(必须熟悉 CommonMessage 类,例如 headerSize 等),所以这个建议的实现可以完成这项工作。
- 这是一个好的做法吗,如果不是,你会建议改变什么?或者我应该遵循什么准则?或者在这种情况下,我应该遵循任何经验法则吗?(例如,不要在同一类中混合 A 和 B)。
答:
1赞
bitmask
9/3/2022
#1
这通常被认为是代码异味的原因是,它看起来像是通过使用多态性进行代码重用。但多态性并不是为了代码重用。模板是。
所以,首先,如果你有一个具有纯虚拟成员函数且没有虚拟析构函数的类。该类可能不应有任何虚拟成员。
一般来说,如果可以,请尝试使用模板。在你的情况下,我可能会做的是有一个知道如何序列化给定有效负载的东西(甚至可能有效负载本身也知道这一点)。然后,将消息类型模板插入在一起,该模板知道如何将有效负载序列化与标头序列化一起插入。
如果只能在运行时决定必须处理的有效负载,请尽可能多地提取调度并尽早实例化正确的类型。这可能意味着您必须为大多数中间步骤传递模板参数。
话虽如此,在某种程度上,您可能会过于担心遵守一些严格的设计要求。大多数准则都有例外。
评论