在for循环中创建的C ++多态指针指的是同一个东西,这是因为我没有使用智能指针吗?

时间:2015-03-27 19:37:41

标签: c++ pointers polymorphism

我的程序中有一个基类和两个子类。 我对c ++完全不熟悉,也不是 我有类似于以下循环的东西:

baseclass * arr[10];
for (i = 0; i < 10; i++) {
   if (some condition) {
    SubclassA subA;
    subA = SubclassA(stuff);
    arr[i] = &subA;
   }
   else if (some other condition) {
    SubclassB subA;
    subB = SubclassB(stuff);
    arr[i] = &subB;
   }
}

当我运行我的代码并首先创建一个SubclassA并将其地址分配给我的数组时。 然而,我发现以下情况正在发生:在上一步之后,当我稍后在循环中创建一个SubclassB时,由于某种原因,SubclassB是在我的SubclassA所在的同一个内存位置进行的:它&#39;完全覆盖我的第一个物体,我不明白为什么。

4 个答案:

答案 0 :(得分:3)

在C ++中subA = SubclassA(stuff);并不意味着分配和创建一个全新的对象,然后为它分配一个引用。 subA是一个本地对象,一旦到达封闭的},它就会消失。您无法将其地址存储到阵列中。

您需要使用new实际分配新对象,并且最好使用智能指针来控制所有权和生命周期:

Typedef std::array<std::unique_ptr<baseclass>, 10> ArrType;
ArrType arr;
for (i = 0; i < 10; i++)
{
    if (some condition)
    {
        arr[i] = ArrType::value_type(new SubclassA(stuff));
    }
    else if (some other condition)
    {
        arr[i] = ArrType::value_type(new SubclassB(stuff));
    }
}

答案 1 :(得分:1)

您需要使用指针并创建new个对象以添加到数组中,而不是使用本地对象。

baseclass * arr[10];
for (i = 0; i < 10; i++) {
   if (some condition) {
    arr[i] = new SubclassA(stuff);
   }
   else if (some other condition) {
    arr[i] = new SubclassB(stuff);
   }
}

并且不要忘记你需要完成数组并在完成后删除指针。

for (i = 0; i < 10; i++) {
   delete arr[i];
}

答案 2 :(得分:1)

尝试在子类中使用new

baseclass * arr[10];
    for (i = 0; i < 10; i++) {    
        if (some condition) {
        SubclassA subA =  new SubclassA(stuff);
        arr[i] = subA;    
        }    
        else if (some other condition) {
        SubclassB subB = new SubclassB(stuff);
        arr[i] = subB;    
        } 

}

答案 3 :(得分:1)

您正在存储指向局部变量subAsubB的指针。当变量超出范围时,对象将被删除,指针将悬空。

要修复它,您必须使用动态内存分配。建议使用std::unique_ptr等智能指针管理动态分配的内存。

std::vector<std::unique_ptr<baseclass>> arr;

for (int i = 0; i < 10; i++) {
  if (some condition) {
    arr.push_back(std::make_unique<SubclassA>());
  } else if (some other condition) {
    arr.push_back(std::make_unique<SubclassB>());
  }
}