2

在 C++ 中实现指向不同类型的指针列表的最佳方法是什么?

我想过做这样的事情:

enum MyType {...};
typedef std::pair<MyType, void*> Ptr;
std::vector <Ptr> list;

然后在我需要访问列表中的一个对象时立即进行合适的静态类型转换。

另一种方法是为每种对象类型设置不同的向量:

std::vector<ClassA*> list_a;
std::vector<ClassB*> list_b;
...

问题是我需要实现一个图,其中并非所有顶点都具有相同的类型。

编辑。性能至关重要。代码效率越高越好。

4

5 回答 5

6

您最好的解决方案是让所有类都继承自同一个类,并将指向基类的指针存储在列表中。仅将 avoid*作为最后且非常非常危险的解决方案。

于 2013-11-11T18:39:37.753 回答
3

我宁愿为图形的所有节点定义一个公共超类,例如

class Node {
   // probably some fields giving siblings, or at least a unique number
};

class GreenNode : public Node {
    // etc...
};

class YellowNode : public Node {
};

class BlackLeaf : public Node {
};
于 2013-11-11T18:40:13.530 回答
2

让所有不同类型的顶点从基Vertex类继承,然后使用Vertex*.

于 2013-11-11T18:40:00.850 回答
1

如前所述,最好使用基类 + 它的后代。但是如果你真的想为节点使用 C 结构,那么你可以使用一种常见的“C”风格的方法——在每个结构的开头放置一些字段(让它是 int 字段)来描述节点的类型。它可以帮助您找出每个节点的类型:

typedef enum {
  SMALL_NODE = 1,
  NORML_NODE,
  HUUGE_NODE,
} type;

struct small_node {
  unsigned int type; /* type above - SMALL_NODE */
  /* ... */
};

struct norml_node {
  unsigned int type; /* type above - NORML_NODE */
  /* ... */
};

struct huuge_node {
  unsigned int type; /* type above - HUUGE_NODE */
  /* ... */
};
于 2013-11-11T18:45:37.207 回答
1

根据您的标准,共有三个选项:

  1. 使用 void* 指针:这明确告诉任何阅读您的代码的读者“类型信息正在被删除”。这涵盖了所有情况,但完全由您来确保类型信息可在其他需要它的地方检索。

  2. 使用侵入式多态性,您可以在此列表中定义成员资格所需的类,并且必须将其继承到任何想要指向的类中。

    struct ListInterface { // struct for defaulting to public
        void Poke(uint addr, uint value) = 0;
        uint Poke(uint addr) const = 0;
    };
    
    class SplineVertex : public Vertex, public ListInterface {
        ...
    };
    
  3. 使用非侵入式多态性,您可以从任何需要成员资格的类创建派生类。

    struct ListInterface { // struct for defaulting to public
        void Poke(uint addr, uint value) = 0;
        uint Poke(uint addr) const = 0;
    };
    
    class SplineVertex : public Vertex {
        ...
    };
    
    class SplineVertexHolder : public SplineVertex, public ListInterface {
    };
    
于 2013-11-11T18:49:51.980 回答