指向不同类型对象的指针列表
List of pointers to different types of objects
在
C++中实现指向不同类型的指针列表的最佳方法是什么?
我想做这样的事情:
enum MyType {...};
typedef std::pair<MyType, void*> Ptr;
std::vector <Ptr> list;
然后在我需要访问列表中的一个对象时立即执行合适的静态类型转换。
另一种方法是为每个对象类型使用不同的向量:
std::vector<ClassA*> list_a;
std::vector<ClassB*> list_b;
...
问题是我需要实现一个图,其中并非所有顶点都具有相同的类型。
编辑。性能至关重要。代码越高效越好。
最好的解决方案是让所有类都继承自同一个类,并在列表中存储指向基类的指针。仅使用void*
作为最后且非常非常危险的解决方案。
我宁愿为图的所有节点定义一个通用的超类,例如
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 {
};
从基类Vertex
继承所有不同类型的顶点,然后使用Vertex*
列表。
如前所述,最好使用基类 + 其后代。但是如果你真的想对节点使用 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 */
/* ... */
};
根据您的条件,有三个选项:
-
使用 void* 指针:这在告诉任何代码的读者"正在删除类型信息"时是明确的。这涵盖了所有情况,但完全取决于您确保类型信息可以在需要的其他地方检索。
-
使用侵入式多态性,即定义此列表中成员资格所需的类,并且必须将其继承到要指向的任何类中。
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 { };
相关文章:
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 如何将共享指针列表传递到pybind11中的c++对象
- C++:如何初始化包含具有给定键的指针列表的映射
- 使用继承的指针列表复制构造函数或重载运算符=
- 我应该如何在工厂类中存储弱指针列表?
- Qt单元测试:指针列表上的QCOMPARE函数
- 如何正确释放要配对的指针列表?
- 如何在 c++ 上对指针列表进行排序
- 从地图复制到指针列表
- 我对C 中共享指针列表进行排序的功能未完成类型
- const_iterator引用的指针列表
- 在 c++ 中生成字符串到 std::指针列表的映射
- 访问链表中的结构(带有指向其子实现的指针列表的树)
- 有没有办法使用基于范围的迭代器来迭代对指针列表值的引用?
- 使用迭代器指针 (C++) 从对象指针列表中删除元素
- 无法列出定制类型的指针列表
- 创建指针列表的正确范例是什么
- 如何将指向指针列表的私有指针作为 const 返回
- C++填充指向指针**列表的指针,该列表指向指针地址