2012-04-14 53 views
1

對不起混淆主題,這是原來的問題:C++派生類陣列再分配

如何重新分配指針的基類的陣列,實際上 指向不同派生類?

我不應該如果可能的話在這裏使用動態轉換,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

你不應該需要做任何鑄造(動態或其他):剛剛重用

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的(對象指向的)舊的陣列中三分球,因爲這將在新的無效者(該對象被存儲的指針指向不不再存在) - 只需刪除原始數組即可。

如果指針的管理變得繁瑣,可以使用某種共享指針(Boost庫提供了多種,例如)

+0

謝謝你,我只是意識到自己..但是在副本怎麼做構造函數或運算符=?我需要以某種方式複製那裏的元素。 – 2012-04-14 12:42:00

+2

如果實際需要製作元素的副本,最好的方法是提供一個'copy'或'clone'虛擬方法,返回一個新分配的對象,該對象是原始副本:您需要用每個派生類的適當邏輯。你可以在[本次對話]中看到一個例子(http://en.allexperts.com/q/C-1040/constructor-virtual.htm) – Attila 2012-04-14 12:48:12

+0

完美,謝謝! – 2012-04-14 12:55:29