c++ - 根据ID值选择正确的派生类

标签 c++ class templates

我在 C++ 中有一个名为 InformationElement 的类,它定义了以下信息元素框架结构:

<-元素 ID-> <-元素长度-><-可变负载->

  1. 元素 ID 为 1 字节。
  2. 元素长度为 1 字节长。它定义了有效载荷部分的长度。
  3. 该类包含用于内容序列化和反序列化的虚函数 + 定义 ElementID 的类型。

从这个类继承了不同的派生类,例如:

  1. 类(class)能力
  2. 操作类。
  3. 类 TimingParameters。

每个派生类都有一个唯一的元素 ID 和不同的负载。

不同的信息元素(IE)将被封装在一个更大的框架中。这个更大的框架包含封装在其中的信息元素的数量。

<-IE数量-> <--IE 1--> <-- IE 2 --> <-- IE 3 --> ......

从发送方的角度来看,序列化这些信息没有问题。但是,在接收方,接收方必须提取元素 ID,并根据该值选择正确的派生类来处理有效负载部分,即处理反序列化操作。在接收方执行此操作的传统方法是构建一个大型开关盒,如下所示:

InformationElement *element;
switch (elementID)
{
  case 1:
    element = new Capabilties;
  case 2:
    element = new Operation;
  case 3:
    element = new TimingParameters;
}

但是,如果我有 100 个元素,比较起来就太多了,而且它不会扩展那么多。

所以我的问题是,在 C++ 中,有什么比为每个独立的元素 ID 插入一个独特的案例更好的聪明方法吗?

最佳答案

我建议使用工厂。查看Boost.Functional/Factory合理实现。

如果你不想使用 boost,Factory ,来自 wikibooks,显示了一个简化的 C++ 实现,可以帮助您入门。

wikibooks 讨论中的一个重大遗漏是缺乏半自动注册,这在这篇博文 Factory Design Pattern in C++ 中进行了讨论。以及关于 CodeProject 的两篇文章 A C++ Object FactoryFactory Pattern in C++ .

当然,对此也有一个 SO 答案: Is there a way to instantiate objects from a string holding their class name?

关于c++ - 根据ID值选择正确的派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32012349/

相关文章:

c++ - SecVerifyTransformCreate 内存泄漏?

java - 为什么我们把存储对象属性的变量称为实例变量呢?

c++ - 如何使用模板在C++中创建两个非常相似的成员函数

javascript - 如何使用带下划线模板的 HTML 缩小器

c++ - 为指针或标量优化函数

c++ - DLL注入(inject)和偏移读内存

c++ - 如何在 C++ 中显示井字游戏的赢家?

C++ 多维数组索引

c++ - 在 Linux 上使用 geany

c++ - 在类中使用数组时出现问题 (C++)