2015-08-14 38 views
0

我在C++类名为InformationElement它定义了如下的信息单元的帧结构:选择corect导出基于ID值基于类

< - 元素ID-> < - 元素长度 - > < -Variable净荷 - >

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

从这类不同派生类继承例如:

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

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

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

< IEs-的-Number> < --IE 1 - > < - IE 2 - > < - IE 3 - > ......

从发射机点查看序列化这些信息没有问题。然而,在接收端,接收端必须提取Element ID,并根据该值,接收端选择正确的派生类来处理净荷部分,即处理反序列化操作。在接收端这样的传统方法是建立一个大的开关情况如下:

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

但是,如果我有100个元素,这将是太多与比较,也不会扩大该许多。

所以我的问题是有没有什么聪明的方式来做到这一点在c + +比为每个独立的元素ID插入一个独特的情况?

+1

有什么不对switch语句?我更喜欢我认为的任何其他解决方案。 – Barry

+0

您需要表达每个标识符与相应类型*之间的关联*。每种类型的解决方案是否需要一些关联以适合您的账单? – Quentin

+0

@Quentin,你有什么建议? – IoT

回答

2

我建议使用一个工厂。请参阅Boost.Functional/Factory以获得合理的实施。

如果你不想使用升压,Factory,从维基教科书,显示了一个简化的C++实现,可以帮助你开始。

从维基讨论的一个大的遗漏是缺乏半自动注册,这是在这个博客帖子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?

+0

我不想使用任何外部库。有没有可能做到这一点,而不使用Boost? – IoT

+1

这是一个无法回答的问题。您需要首先确定类型以获取工厂对象。我的代码片段中的lambda表达式实现了工厂模式,但它们不会让它看起来像一个大问题。链接的问答通过将交换机放在课堂中来解决问题。 – Potatoswatter

1

switch - case并用相同的东西代替它。例如,

typedef InformationElement * (*ElementCreatorFunction)(); 
std::map< ElementEnum, ElementCreatorFunction > ElementCreatorMap { 
    { 1, []() -> InformationElement * { return new Capabilities; } }, 
    { 2, []() -> InformationElement * { return new Operation; } }, 
    { 3, []() -> InformationElement * { return new TimingParameters; } } 
}; 

InformationElement * element = ElementCreatorMap[ elementID ](); 

这允许运行时自定义和模块化。 “案例”的主体可以在不同的源文件或动态加载的模块中。

一个较小的变化是用类似但更安全的替代容易出错的语句switch-case。我的safe_switch library提供了CASE而不需要break;,这在您的示例中已被遗忘。

顺便说一句,它看起来像std::unique_ptr<InformationElement>可能比InformationElement *更合适。

+0

在我的解决方案中,我再次回到相同的问题,不得不添加每个新的信息元素。那么为什么你提出这个解决方案呢?在比较速度和选择正确派生类别方面是否有任何不同 – IoT

+1

这看起来像是一个非常非常奇特的“开关”给我。 – Quentin

+1

@IoT你提到了可伸缩性。此解决方案更容易扩展 - 请参阅编辑。至于性能方面,'switch'声明可能是无与伦比的,但你没有提到问题中的性能。 – Potatoswatter