mgf*_*nan 5 c++ oop design-patterns
这是对象设计模式专家的问题.
假设我有一个Parser负责读取/解析数据流(携带不同类型的信息包)的类.每个数据包携带不同类型的信息,所以最好我想有一个类为每种类型的数据包(PacketTypeA,PacketTypeB,...每个人都有自己的接口).
class Parser {
public:
/* ctor */
/* dtor */
void read_packet(/* arguments */);
// methods...
private:
// more methods...
}
Run Code Online (Sandbox Code Playgroud)
Parser::read_packet然后,该方法将遍历流并将类(或指针或对类的引用)返回到适当的数据包类型.
你会使用void指针吗?通用类(PacketBasicInterface)如何提供一个公共(部分)接口来查询数据包的类型(以便随后可以在运行时做出任何决定)?
// 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(), ...
}
Run Code Online (Sandbox Code Playgroud)
任何想法或反馈将非常感谢!
非常感谢!
这就是std :: variant的用途.
我将定义一个枚举类,枚举所有可能的数据包类型:
enum class packet_type {initialization_packet, confirmation_type, ... };
Run Code Online (Sandbox Code Playgroud)
并read_packet返回一个packet_type元组和一个变体:
typedef std::variant< ... > packet_info;
std::tuple<packet_type, packet_info> read_packet();
Run Code Online (Sandbox Code Playgroud)
不需要正式的枚举,但它更容易弄清楚如何处理变体.
这种一般方法的一些变化包括:
使用不透明std::string而不是固定的枚举来指定数据包类型.
使用std::any而不是正式std::variant.
不使用简单的枚举或像a这样的不透明标记,而是std::string使用稍微不重要的类来定义数据包类型,类的方法将变量元数据作为参数,并封装可以对数据包执行的操作.
当然,如引用链接中所述,std::variant需要C++ 17.对于您更新编译器来说,这将是一个很好的理由:您可以通过一种简单的方法来实现完全类型安全的方法.
| 归档时间: |
|
| 查看次数: |
685 次 |
| 最近记录: |