gpt4 book ai didi

c++ - 在重写方法中返回不同的枚举

转载 作者:行者123 更新时间:2023-11-28 05:22:58 25 4
gpt4 key购买 nike

假设您必须在 C++03 中设计一个系统,您必须在其中管理来自不同来源的不同类型的消息。

所有消息都有一个共同的属性,即 ID,该数字表示消息中包含的数据的含义

因此ID与来源相关,不同的来源可以有其他来源的公共(public)ID。即 SourceASourceB 可以发送 ID 设置为 1 的消息,尽管消息中数据的含义完全不同。

因此表示消息的基类可以声明如下:

enum SourceType {
SourceA,
SourceB,
// ...
};

struct Message {
virtual int getID();
virtual SourceType getSource();
// ...
};

因为我想避免在我的代码中散布魔数(Magic Number),所以我想用一些更有意义的枚举替换int,但由于每个来源都有自己不同的枚举是不可能的。

一个解决方案是使用 getSource 返回的信息将 int 转换为正确的 enum,但这似乎是一个非常完美的设计。

另一种解决方案是为所有具有大量重复值(这不是错误)的源定义一个包含所有可能 ID 的大枚举,如下所示:

enum MessageID {
SourceA_ID1,
SourceA_ID2,
SourceB_ID1,
SourceB_ID2,
// ...
};

因此 getID 消息可以返回 MessageID,但这意味着 MessageID 的大小会爆炸式增长,并且在维护和记录方面可能会有点困惑。

最佳答案

选择你的第一个选择:

One solution could be casting the int to the proper enum using the information returned by getSource, but it seems a very flawless design.

基本上 enum 等于 int。它作为一种创建常量和避免代码中出现魔数(Magic Number)的简单方法而存在。所以有可能:

enum SourceType {
SourceA,
SourceB,
// ...
};

struct Message {
virtual int getID();
virtual SourceType getSource();
// ...
};

// Maybe in "sourceA.h"
enum SourceA_Ids {
SourceA_ID1 = 1,
SourceA_ID2 = 12,
SourceA_ID3 = 20
};

// Maybe in "sourceB.h"
enum SourceB_Ids {
SourceB_ID1 = 1,
SourceB_ID2 = 2,
SourceB_ID3 = 3
};

并且在您的代码中,直接进行赋值和比较而无需转换任何内容,因为 enum 到 int 是隐式的:

// sourceA.h
struct MessageFromSourceA: Message {
double data;
...
MessageFromSourceA() {
source = SourceA;
data = 0;
}
};

// sourceA.cpp
void processMsgFromSourceA(Message &msg) {
if (msg.getID() == SourceA_ID1) {
// Send an answer
MessageFromSourceA msga;
msga.id = SourceA_ID2;
msga.data = 123.456;
send(msga);
}
}

如您所见:没有神奇的数字,没有编译错误。

关于c++ - 在重写方法中返回不同的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41085435/

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