需要列表设计(面向对象)建议

List design (Object oriented) suggestion needed

本文关键字:面向对象 建议 列表      更新时间:2023-10-16

我正在尝试使用c++实现一个嵌入式设备列表的通用类。这样的类将提供更新列表、排序列表、基于某些用户指定的标准过滤列表、基于某些用户指定的标准对列表进行分组等方法。但是我希望这个泛型类支持的列表有相当多的种类,这些种类中的每一个都可以有不同的显示方面。示例:一种列表的每个元素中都可以有字符串和浮点数。其他种类可以在每个元素中包含位图、字符串和特殊字符。等。

我用感兴趣的方法(sort, group等)写了一个类。这个类有另一个类的对象(比如DisplayAspect)作为它的成员。但是DisplayAspect类的成员变量的数量和每个成员变量的类型是未知的。实现这一点的更好方法是什么?

为什么不使用std::list, c++提供了这个,并且它提供了你提到的所有功能(它是模板化的类,所以它支持你能想到的所有数据类型)。

同样,没有必要重新发明轮子,因为您编写的代码几乎永远不会像std::list那样高效。

如果你还想重新发明这个轮子,你应该写一个模板列表类

首先,您可能应该使用std::list作为您的列表,正如其他人所述。然而,在我看来,你的问题更多的是在列表中写什么,所以我把重点放在问题的那一部分上。

由于您还希望在列表的每个元素中存储多个信息位,因此您将需要创建多个类,一个用于存储每个组合。您没有描述为什么要存储多比特信息,但是您希望为每个类使用一个逻辑名称。因此,例如,如果您要存储一个名称和一个价格(字符串和双精度类型),您可以给类命名为Product

你提到创建一个名为DisplayAspect的类。

  • 如果这是因为您希望用一段代码打印所有这些列表,那么您应该使用继承和多态性来实现这一目标。实现这一目标的一种方法是使您的DisplayAspect类成为具有所需功能(例如printItem())的纯虚拟抽象类,并使您为数据组合创建的每个类都成为此DisplayAspect类的子类。
  • 另一方面,如果您创建了DisplayAspect类,以便可以重用列表代码,则应该查看模板类。std::list是一个模板类的例子,它可以保存任何你想放入的类型,在这种情况下,你可以删除你的DisplayAspect类。

其他人(例如@Als)已经对你的问题给出了明显、直接的答案。如果你真的想要一个链表,他们无疑是正确的:std::list显然是首选。

然而,我要建议您可能根本不需要链表。链表只是很少有用的数据结构。考虑到您所说的需要(排序、分组),特别是您的目标(嵌入式系统,因此您可能没有很多内存可以浪费),链表可能不是您想要做的事情的一个很好的选择。至少现在,它听起来更像一个数组,可能更有意义。

如果你最终(错误地)决定链表确实是正确的选择,那么你很有可能只需要一个单链表。为此,您可能需要查看Boost Slist。虽然这是一个小的额外的工作使用(它是侵入性的),这通常会有较低的开销,所以它至少不是一个很差的选择,因为许多通用的链表。