我在 C++ 中有一个名为 InformationElement 的类,它定义了以下信息元素框架结构:
<-元素 ID-> <-元素长度-><-可变负载->
- 元素 ID 为 1 字节。
- 元素长度为 1 字节长。它定义了有效载荷部分的长度。
- 该类包含用于内容序列化和反序列化的虚函数 + 定义 ElementID 的类型。
从这个类继承了不同的派生类,例如:
- 类(class)能力
- 操作类。
- 类 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 Factory和 Factory 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/