gpt4 book ai didi

c++ - 灵活的设计来替换 switch 语句

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:41 24 4
gpt4 key购买 nike

我正在研究网络程序并使用 C++ 设计 Linux 服务器。这是相当简单的设计基本结构。我有一个带有固定大小的 header 的数据包定义。

typedef enum{
PACKET_LOGIN_REQ = 1,
PACKET_LOGIN_RES,
PACKET_STORE_REQ,
PACKET_STORE_RES
}PACKET_TYPES;

typedef struct {
PACKET_TYPES type;
short bodySize,
long long deviceId
}HEADER;

.
.

/*more definitions here*/

typedef struct{
HEADER head;
union BODY{
LOGIN_REQ loginReq;
LOGIN_RES loginRes;
.
.
more types
}
}

每当我添加更多数据包类型时,我都必须修改 switch 语句以添加更多案例来处理新添加的数据包。

我正在使用 union 类型,所以我不必更改整个数据包结构。相反,我可以将新添加的数据包类型添加到 union 结构中。

但是,当我尝试使用 switch 语句解析原始数据以放入数据包时,我必须每次都添加每个 switch 语句。

我认为这不是一个好的设计模式,我想知道如何以更灵活的方式设计结构。

有没有更好的方法来处理这个问题(更好的设计模式)?相关教程或引用资料呢?

最佳答案

您应该使用类而不是 switch 使用多态调用。

类似的东西(伪代码):

class Packet{
public:
Packet();
virtual ~Packet();
virtual HandleMe()=0;
protected:
// fields
}

PacketTypeOne: public Packet{
public:
virtual HandleMe(); // implementation for type 1
}

PacketType2: public Packet{
public:
virtual HandleMe(); // implementation for type 2
}

PacketTypeX: public Packet{
public:
virtual HandleMe(); // implementation for type X
}

以及从哪里获得数据包:

...
Packet* newPacket = PacketFactory::CreateNewPacket(packetTypeX); // factory will create
// the right instance.
...
// now handle it:
newPacket->HandleMe();
...

完成。

关于c++ - 灵活的设计来替换 switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6354681/

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