我有一个继承层次结构。我的基类是一个抽象类。
class A{};
class B : public A{};
class C : public A{};
class D : public A{};
class E : public A{};
我希望将子类B,C,D,E中的对象发送到矢量容器。
我知道我可以创建一个Handle类来执行此操作。有人可以推荐一本我可以阅读的好教程或文章,它会告诉我如何做到这一点吗?
我知道我可以使用boost :: any作为解决方案,但是我想尝试使用Handle类来解决这个问题。
感谢。
答案 0 :(得分:2)
您不需要句柄或boost::any
,指向A
的指针在这种情况下已经是最好的“句柄”。所以你想要的是vector
包含A*
或更好的智能指针。
哪个智能指针取决于相关对象的生命周期。如果您需要包含的对象的生命周期与容器的生命周期无关(即容器不拥有包含的对象,只是引用它们),那么shared_ptr<A>
是您的最佳选择。
另一方面,shared_ptr
附加了开销,因此在对象的生命周期被容器的生命周期所包含的情况下,它们仅用于从容器中检索它们(即容器拥有所包含的对象),unique_ptr<A>
可能是您的最佳选择。
(如果您的编译器还不支持unique_ptr
,那么您可以考虑查看Boost指针容器库,它提供管理所包含对象生命周期的标准容器。)
简而言之,您应该使用std::vector<std::shared_ptr<A>>
或std::vector<std::unique_ptr<A>>
,具体取决于相关对象的生命周期。
答案 1 :(得分:0)
正如有人提到的,std::vector<shared_ptr<A> >
可能是最简单的选择。另外,boost :: variant是你可以看到的东西,但在这种情况下它并没有意义,所有类都有共同的父级。如果您确实计划在派生类中拥有任何数据成员,请不要忘记向A添加虚拟析构函数。
答案 2 :(得分:0)
我修改后的答案!
class A{};
class B : public A{};
class C : public A{};
class D : public A{};
class E : public A{};
类B,C,D和E将A类作为公共基类。只需定义容器以保存指向此基类A的指针。接下来,将派生类对象存储在容器中。通过将对象地址存储为容器中的元素来执行此操作。您可以通过多态使用类型A的指针来访问容器中的对象。检查虚拟构造函数习惯用法。