【问题标题】:List (vector) of different structs不同结构的列表(向量)
【发布时间】:2014-08-13 06:46:33
【问题描述】:

是否可以有某种不同结构的列表/数组/向量?

例如在MFC 中有CObjectCArray 但没有MFC:

我可以做类似的事情

std::vector<void*> pVec;
{
  MYSTRUCT m = new MYSTRUCT;
  pArr.push_back(m);
  // looks fine here
}
//what is in my vector now?

有什么可以处理的吗?

【问题讨论】:

  • 您可以从基础class 继承所有涉及的struct,并利用动态多态性。
  • 容器中你想要的结构有关系吗?可以使用继承吗?在容器中需要不同(不相关的)结构对我来说似乎是一个设计缺陷。你怎么知道某个指针是什么类型的结构?
  • @JoachimPileborg 他们是不同的,但肯定可以建立某种关系
  • 不要仅仅试图通过继承来强制结构关联,除非它们确实如此。另外,您可能想阅读about the XY problem,因为您现在要求我们帮助您解决您已经决定的解决方案,但您实际上并没有告诉我们您想解决什么问题是。可能还有其他的,或许更好的解决方案。不,问题不在于“如何将不相关的结构放入容器中”,而是让您想出解决方案“将不相关的结构放入容器中”的原因。
  • 就目前的普遍性而言,这个问题很可能是现有问题的重复:stackoverflow.com/questions/6274136/…stackoverflow.com/questions/3475030/… 是两个候选者。

标签: c++ vector


【解决方案1】:

显而易见的首选方法是使用std::vector&lt;Base*&gt; 来处理多态类型。

如果你真的有完全不相关的类型,看起来就是这样,那么boost::anyboost::variant 类型的橡皮擦可能就是你要找的东西:

std::vector< boost::variant<int, std::string> > vec;
vec.push_back( 21 );
vec.push_back( "hello " );

【讨论】:

    【解决方案2】:

    你给出的例子很危险。你如何清理(即delete)你分配的东西?它的类型已被分配给void * 被擦除,那么编译器如何知道要调用哪个operator delete

    您至少可以通过两种不同的方式安全地解决此问题:

    • 所有对象都可以从具有virtual 析构函数的公共基础继承。然后,您可以将std::unique_ptrs 的std::vector 设置为公共基础。这具有可扩展的优点(您可以声明从公共基础派生的新类型并将它们放入容器中而无需修改容器),但缺点是需要您转到空闲存储区(为std::unique_ptrs 指向)。
    • 您可以使用变体类型,例如boost::variant。这不需要公共基础或免费存储上的分配,但它将要求您在声明容器时声明所有可能存储在容器中的类型(即,它不像基于继承的那样容易扩展解决方案)。

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      相关资源
      最近更新 更多