C ++将子对象存储在公共容器中

时间:2014-11-04 18:17:24

标签: c++ oop

我在命名空间中有一组抽象父类,类似于以下

namespace Core {
    class Sparse;
    class Dense;
}

我在某处定义了这些类,之后我派生了一些子类:

class SparseA: public Core::Sparse;
class SparseB: public Core::Sparse;
class DenseA: public Core::Dense;

现在我想实例化子类的一些对象,并将它们存储在一个可以从任何地方访问的公共容器中。我怎么能这样做?

另一个问题:我是否应该在Core命名空间中包含子类?

谢谢。

1 个答案:

答案 0 :(得分:2)

由于长类SparseDense不相关,因此您无法将派生类的实例存储在同一个c ++标准容器中(除非您将使用{{1 }或boost::variant)。

如果你给它们一个公共(抽象)基类,你可以使用智能指针(例如boost::anystd::unique_ptr<>)继续在容器中引用它们(使用与样本中相同的伪语法) )

std::shared_ptr

另一个选项可能是模板包装类解决方案

namespace Core {
    class CommonBase;
    class Sparse : public CommonBase;
    class Dense : public CommonBase;
}

typedef std::vector<std::unique_ptr<Core::CommonBase>> MyContainerType;

后者允许在单个容器中松散地耦合namespace Core { class WrapperBase { public: // Expose the common interface of Sparse and Dense as // pure virtual functions virtual void foo() = 0; virtual ~WrapperBase() {} }; template<class Impl> class Wrapper : public WrapperBase { private: Impl& impl_; public: Wrapper(Impl& impl) : impl_(impl) {} void foo() { impl.foo(); // Delegate to the actual implementation } }; class Sparse; class Dense; } typedef std::vector<std::unique_ptr<Core::WrapperBase>> MyContainerType; MyContainerType container; container.push_back(std::make_unique<Wrapper<SparseA>>()); container.push_back(std::make_unique<Wrapper<SparseB>>()); container.push_back(std::make_unique<Wrapper<DenseA>>()); Sparse之类的类,但仍然至少需要一些抽象接口,可以对两个类和类使用行为一致源自他们。