异构容器和处理对象

时间:2015-06-25 14:04:24

标签: c++

我有一个继承层次结构。我的基类是一个抽象类。

      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类来解决这个问题。

感谢。

3 个答案:

答案 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的指针来访问容器中的对象。检查虚拟构造函数习惯用法。