C ++派生类数组重新分配

时间:2012-04-14 12:33:42

标签: c++ realloc derived

很抱歉混淆了这个话题,这是原来的问题:

  

如何重新分配指向基类的指针数组,实际上   指向不同的派生类?

如果可能,我不应该在这里使用动态强制转换,typeid或RTTI ..

编辑我刚刚意识到我可以尝试保存数组元素,只需将新数组中的指针设置为旧元素。但是,如何做operator =或Cctor?

或者:

  

如何通过实际复制元素来重新分配这个数组“坏方法”?

一个例子:

class Base {...}
class Derived1 : public Base {...}
class Derived2 : public Base {...}

int main()
{
  int arrayLength=0, arrayMaxLength=3;

  Base **array=new Base*[arrayMaxlength];
  array[0]=new Derived1();
  array[1]=new Derived2();

  //Reallocation starts...
  Base **tmp=new Base*[arrayMaxLength*=2];

  for(int i=0;i<arrayLength;i++)
    tmp[i]=new Base(*array[i]);      //<------ What to put here instead of Base?


  //The unimportant rest of Reallocation..
  for(int i=0;i<arrayLength;i++)
    delete array[i];
  delete [] array;
  array=tmp;
}

1 个答案:

答案 0 :(得分:1)

您不需要进行任何转换(动态或其他):只需重用指针

Base **array=new Base*[arrayMaxlength]; 
array[0]=new Derived1(); 
array[1]=new Derived2(); 

//Reallocation starts... 
Base **tmp=new Base*[arrayMaxLength*=2]; 

for(int i=0;i<arrayLength;i++) 
  tmp[i]=array[i]; 

// ...

对象已经分配并具有正确的类型。您只需将指针本身复制到新数组即可。

注意你必须注意不要在旧数组中delete(指向的对象)指针,因为这会使新数组中的指针无效(存储指针所指向的对象不再存在) - 只需删除原始数组iself。

如果指针管理变得繁琐,你可以使用某种共享指针(例如BOOST库提供各种各样的指针)