在C ++中实现指向不同类型的指针列表的最佳方法是什么?
我想做这样的事情:
enum MyType {...};
typedef std::pair<MyType, void*> Ptr;
std::vector <Ptr> list;
然后在我需要访问列表中的一个对象时立即进行合适的静态类型转换。
另一种方法是为每种对象类型设置不同的向量:
std::vector<ClassA*> list_a;
std::vector<ClassB*> list_b;
...
问题是我需要实现一个图形,其中并非所有顶点都具有相同的类型。
EDIT。表现至关重要。代码越有效越好。
答案 0 :(得分:6)
您最好的解决方案是让所有类从同一个类继承并存储指向列表中基类的指针。仅使用void*
作为最后且非常非常危险的解决方案。
答案 1 :(得分: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 {
};
答案 2 :(得分:2)
让所有不同类型的顶点从基类Vertex
类继承,然后使用Vertex*
列表。
答案 3 :(得分: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 */
/* ... */
};
答案 4 :(得分:1)
根据您的标准,有三种选择:
使用void *指针:这明确告诉任何读者您的代码“正在删除类型信息”。这涵盖了所有情况,但完全取决于您确保可在其他地方检索类型信息。
使用intrusive-polymorphism,您可以在此列表中定义成员资格所需的类,并且必须将其继承到任何想要指向的类中。
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 {
...
};
使用非侵入式多态,从而从任何想要成员资格的类创建派生类。
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 {
};