gpt4 book ai didi

C++ 在公共(public)容器中存储子对象

转载 作者:太空狗 更新时间:2023-10-29 21:42:19 25 4
gpt4 key购买 nike

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

namespace Core {
class Sparse;
class Dense;
}

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

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

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

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

谢谢。

最佳答案

如长类SparseDense是不相关的,您不能将派生类的实例存储在同一个 C++ 标准容器中(除非您要使用诸如 boost::variantboost::any 之类的花哨的东西)。

如果您给它们一个公共(public)(抽象)基类,您可以使用智能指针(例如 std::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 这样松散地耦合类和 Dense在单个容器中,但仍然至少需要一些抽象接口(interface),可以在行为上一致地用于两个类和从它们派生的类。

关于C++ 在公共(public)容器中存储子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26742162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com