不同类的链接列表 - 以可维护的方式?

时间:2010-11-21 13:19:58

标签: c++

哟人,

我的问题是,我必须找到一种方法来轻松维持下一个情况: 我有一个不同类的链表。我使用void指针,每个类都有“int type”作为它的第一个成员。

现在,当我想调用类成员函数时,我必须这样做: - 读取int,所以我知道类的类型。 - 我用类型信息调用泛型函数,并调用“函数”信息来知道要调用哪个类成员函数。

所以它基本上是一个像这样的开关盒中的开关盒:

void command(void *&pointer, int type, int function)
   {
   switch (type)
      {
      case 1:
      switch (function)
         {
         case 1:
         reinterpret_cast<myClass *>(pointer)->doSomething();
         }
      }

   }

当一个函数(如“doSomething()”需要一些参数时,我甚至不知道该怎么做。

无论如何,它总是一团糟。我相信有比这更好的方法,但不知道它是什么。

有人想开导我吗?

4 个答案:

答案 0 :(得分:2)

Virtual functions是专门发明的,因此您无需切换类型。

答案 1 :(得分:2)

如果您发现自己编写的代码如果“如果A是X类型,然后执行某些操作,如果它是Y类型,那么执行其他操作”,那么您很可能能够使用多态:引入抽象基础那些人。

然后,您将获得该抽象基类的对象列表,并在每个对象上调用一个虚方法。每个类都以自己的方式实现它,因此不需要case和铸造。这通常是最好的解决方案。

但是,如果没有您更详细地描述您的情况,我唯一可以告诉您的是:“重新思考您的课堂设计,因为您可能会遇到一些逻辑错误而且您的问题可能是由于那些”。

答案 2 :(得分:1)

使用标题std::list中的<list>

或者可能实际上某些其他容器可能更合适,但您没有提供问题的详细信息。

无论如何,当你作为初学者觉得需要使用void*时,你知道你做的事情非常错误 - 不要。

干杯&amp;第h。,

答案 3 :(得分:1)

如果您的可能容器元素类型列表有限(似乎可能给出了您计划使用的类型 - &gt;值映射),则可以实现Boost Variants的容器。这比蛮力型更好 - &gt;您目前希望需要的值映射和转换。

在不了解对象的内容的情况下,很难确定这会起作用。