【问题标题】:type conversion of some elements of a vector of objects对象向量的某些元素的类型转换
【发布时间】:2014-01-09 16:42:31
【问题描述】:

我想玩一个对象向量。假设我有一个 Base 类和两个派生类:Derived_ADerived_B

class Base{...}; 
class Derived_A: public Base{}; 
class Derived_B: public Base{};

main() 中,我创建了一个包含 10 个 Derived_A 类对象的向量,例如:

std::vector < Derived_A > array;
array.reserve(10);

现在,我想做的是从这个向量的元素中,选择一个(或几个)并将其类型更改为Derived_B。最后,我将得到一个包含 Derived_A 类的一些元素和 Derived_B 类的一些元素的向量。

这可能吗?或者你有更好的方法吗?

【问题讨论】:

  • 您为什么要这样做? Derived_ADerived_B 不应相互转换。
  • 您不能将Derived_B 放入Derived_A 的向量中。您应该将其设为Base 的向量,然后它可以包含任何派生类。
  • @Barmar:不,Base 的向量只能容纳Base。也许您的意思是Base* 的向量(或智能指针,如果您希望该向量管理对象生命周期)可以保存指向任何派生类的指针。

标签: c++ vector type-conversion


【解决方案1】:

不,这没有任何实际意义。 Derived_ADerived_B 不兼容;只有Base 部分是。

如果您有 std::vector&lt;Base*&gt;virtual 成员函数,那么您可以 [间接] 存储任一类型的对象,但不要将一个对象转换为另一个对象。

顺便说一句,向量不是数组,std::vector::reserve 不创建元素。它只为它们保留内存空间。你的意思可能是std::vector::resize

【讨论】:

  • 是的,你是对的。今天早上我在车里想着这个。我需要多态性,为此,我需要使用指向 Base 类的指针向量。
【解决方案2】:

我认为你需要几件事情是真实的:

  1. 将 Derived_A 转换为 Derived_B 必须切实可行,并且对于非常不寻常的“同级”类。
  2. 您必须使用Base 而不是Deriveds 之一进行存储,即使那样您也不能存储对象,而是指针/引用。
  3. 转换(可能)不会就地发生,因此您可能需要移除/重新插入。

【讨论】:

    【解决方案3】:

    这个

    std::vector < Derived_A > array;
    
    array.reserve(10);
    

    没有定义一个包含 10 个对象的向量。它定义了一个包含 0 个对象的向量。

    至于您的问题,一般情况下,Derived_A 类型的对象可能不会转换为 Derived_b 类型的对象。在这种情况下,通常的方法是定义一个指向基类的指针向量。例如

    std::vector<Base *> v;
    

    并向其添加指向 Derived_A 和 Derived_B 对象的指针。派生类应该继承基类的虚函数。析构函数也必须声明为虚拟的。

    【讨论】:

    • @Lightness Races in Orbit,对不起,先生。
    • 矢量素材没问题。当然,我需要使用 push_back 将对象添加到向量中。我只是想避免太多细节,因为我关心派生类。我同意你的看法,我宁愿使用指向基类的指针向量。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多