gpt4 book ai didi

c++ - 方法返回不同类型/类的设计模式

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:50 26 4
gpt4 key购买 nike

这是对象设计模式专家的问题。

假设我有一个 Parser 类负责读取/解析数据流(携带信息不同类型的数据包)。这些数据包中的每一个都携带不同类型的信息,因此理想情况下我会为每种类型的数据包(PacketTypeAPacketTypeB,......每个都有自己的类)界面)。

class Parser {

public:

/* ctor */
/* dtor */


void read_packet(/* arguments */);

// methods...
private:
// more methods...
}

然后 Parser::read_packet 方法将遍历流并将一个类(或类的指针或引用)返回到适当的数据包类型。

你会为此使用空指针吗?一个通用类 (PacketBasicInterface) 怎么样,它会提供一个公共(public)(部分)接口(interface)来查询数据包的类型(以便可以在运行时做出任何决定)?

// Pure virtual (abstract) class to provide a common (and partial) interface
class PacketBasicInterface {
public:

std::string whoAmI() const = 0;
bool amIofType(const std::string& type) const = 0;

}

// Class to access data of type A packet
class PacketTypeA : public PacketBasicInterface {

public:
// methodA_1()
// methodA_2(), ...
}

// Class to access data of type A packet
class PacketTypeB : public PacketBasicInterface {

public:
// methodB_1()
// methodB_2(), ...
}

任何想法或反馈将不胜感激!

非常感谢!

最佳答案

这就是std::variant是为了。

我会定义一个枚举类,枚举所有可能的数据包类型:

enum class packet_type {initialization_packet, confirmation_type, ... };

并让 read_packet 返回一个 packet_type 元组和一个变体:

typedef std::variant< ... > packet_info;

std::tuple<packet_type, packet_info> read_packet();

并不真的需要一个正式的枚举,但它可以更容易地弄清楚如何处理变体。

这种一般方法的一些变体包括:

  1. 使用不透明的 std::string,而不是固定的枚举,来指定数据包类型。

  2. 使用 std::any 而不是正式的 std::variant

  3. 不是使用简单的枚举,或者像 std::string 这样的不透明标记,而是使用稍微复杂的类来定义数据包类型,类的方法采用变体元数据作为参数,封装了可​​以对数据包进行的操作。

当然,如引用链接中所述,std::variant 需要 C++17。这将是您更新编译器的一个很好的论据:您将获得一种简单的方法来实现完全类型安全的方法。

关于c++ - 方法返回不同类型/类的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42840921/

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