【问题标题】:Storing maps of children in vector of base class将孩子的地图存储在基类的向量中
【发布时间】:2017-04-24 06:31:20
【问题描述】:

我目前正在尝试将<int, Derived> 的多个映射存储在基类的向量中。

例子:

std::map<int, Derived_1 *> map_1 = smth;
std::map<int, Derived_2 *> map_2 = smth_else;

std::vector<std::map<int, Base *>> list;

list.push_back(map_1);
list.push_back(map_2);

但是,在编译时,我得到了派生映射和基类之间没有转换的错误。

有没有更好的(或简单有效的)方法来解决这个问题?提前致谢。

【问题讨论】:

  • 即使list[0]std::map&lt;int, Derived_1 *&gt;,你也可以这样做list[0][0] = new Derived_2;

标签: c++ vector maps


【解决方案1】:

不,没有办法直接实现,因为std::map&lt;int, Base*&gt;std::map&lt;int, Derived_1*&gt;是不同的类型。

最直接的解决方案是在任何地方使用std::map&lt;int, Base*&gt;。另一种方法是创建一个转换函数,但它不太优雅,并且会导致性能损失。

另一种选择,虽然更有限,是使用std::variant(如果使用 C++17)或boost::variant,来存储所有可能的类型。对应的是,您可能必须与访客等打交道。

【讨论】:

  • 在这里问一些愚蠢的问题,但是每次我使用它时我都必须转换为我的派生类型,对吧?
  • 不幸的是,是的。另一方面,如果您使用类层次结构是因为派生类可能实现(覆盖)基类的某些特定行为,在这种情况下您只需调用基类的虚函数。这被称为polymorphism(可能你已经知道了,在这里要清楚一点)。
  • 另一方面,如果每个派生类都有不同的接口,那么我建议检查您的设计(或使用变体)。
猜你喜欢
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 2018-09-17
  • 2013-11-12
  • 2018-01-02
  • 1970-01-01
相关资源
最近更新 更多