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

时间:2011-08-16 15:03:42

标签: c++ list

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

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

3 个答案:

答案 0 :(得分:4)

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

此外,重新发明轮子没有意义,因为您编写的代码几乎不会像 std :: list 那样高效。

如果你仍想重新发明这个轮子,你应该写一个 template list class

答案 1 :(得分:0)

首先,您应该使用std::list作为您的列表,正如其他人所说的那样。在我看来,你对列表中的内容有更多的疑问,但是,我正专注于这部分问题。

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

您提到创建一个名为DisplayAspect的课程。

  • 如果这是因为你想让一段代码打印所有这些列表,那么你应该使用继承和多态来实现这个目标。实现这一目标的一种方法是使您的DisplayAspect类成为一个抽象类,其中包含所需的函数(例如printItem())纯虚拟,并为数据组合创建的每个类都是此类的子类。 DisplayAspect上课。
  • 另一方面,如果您创建了DisplayAspect类以便可以重用列表代码,则应该查看模板类。 std::list是模板类的示例,它将包含您要添加到其中的任何类型,在这种情况下,您可以删除DisplayAspect类。

答案 2 :(得分:0)

其他人(例如@Als)已经明确,直接地回答了你提出的问题。如果你真的想要一个链表,那么它们无疑是正确的:std::list是明显的首选。

但是,我会建议您可能根本不需要链接列表。链表只是rarely一个有用的数据结构。鉴于你所说的你想要的东西(排序,分组),特别是你的目标(嵌入式系统,所以你可能没有浪费很多内存)链接列表可能不是对于你想要做的事情,这是一个非常好的选择。至少在关闭时,听起来更接近阵列的东西可能更有意义。

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