2012-05-14 48 views
0

我想展開並添加一個新的對象到一個函數內的數組,並讓該數組在函數外生效(數組指針作爲一個參數)。展開並添加一個新的對象到一個函數內的數組

void addMedia(Media* medias[], int &nrOfMedias, string title, int publYear, string author, int nrOfPages) 
{ 
    Media** tempArray = new Media*[nrOfMedias +1]; 
    for(int i = 0; i < nrOfMedias; i++) 
    { 
     tempArray[i] = medias[i]; 
    } 
    delete [] medias; 
    medias = tempArray; 
    delete [] tempArray; 
    medias[nrOfMedias] = new Book(title, publYear, author, nrOfPages); 
    nrOfMedias++; 
} 

這段代碼在函數裏面工作的很好,但是當我到外面的時候,數組仍然是空的。據我瞭解,這是因爲指針在函數內部發生了改變,但是如何在不改變指針的情況下擴展數組?

(我不能改變返回數據類型或參數,分配的要求。)

+1

使用矢量,並將它們作爲參考傳遞。更簡單/更安全。 (順便說一下,在那裏第二次刪除看起來很腥) – Mat

+0

*我不能改變返回數據類型或參數*然後它是**不可能**做你想做的。 – cnicutar

+0

是的,我不得不刪除我說的使用向量的答案,因爲我看到了這個要求。 – boiler96

回答

2

不要改變medias = tempArray;*medias = tempArray;,使其編譯,擦亮你的內存管理(考慮,真正應該被釋放,什麼不可以)。

+0

? * medias = * tempArray;得到它與這個代碼一起工作,並刪除刪除[]媒體;謝謝。 – Frozendragon

+0

不,我的意思是'* medias = tempArray',就像Rollie的回答一樣。 – Greg

+0

,給我一個錯誤。智能感知:不能將類型「媒體**」的值分配給類型爲「媒體*」的實體 – Frozendragon

2

請勿將媒體視爲指針數組,請將其視爲指向數組的指針。工作示例(略簡體):

class Media 
{ 
public: 
    Media() { m_strTitle = "unknown";} 
    string m_strTitle; 
}; 

class Book : public Media 
{ 
public: 
    Book(string strTitle) { m_strTitle = strTitle; } 
}; 

void addMedia(Media* medias[], int &nrOfMedias) 
{ 
    Media * tempArray = new Media[nrOfMedias +1]; 
    for(int i = 0; i < nrOfMedias; i++) 
    { 
     tempArray[i] = (*medias)[i]; 
    } 
    delete [] *medias; 
    (*medias) = tempArray; 

    (*medias)[nrOfMedias] = Book("newTitle"); 
    nrOfMedias++; 
} 

int main() 
{ 
    int numMedia = 10; 
    Media * myArray = new Media[numMedia]; 
    addMedia(&myArray, numMedia); 
    for (int i = 0; i < numMedia; i++) 
    { 
     cout << i << ") " << myArray[i].m_strTitle << endl; 
    } 

    return 0; 
} 
+0

好的thx代碼似乎可以正常工作的一個問題。我應該早些提到這一點,但Media是一個抽象類,所以它不會很好地用於addMedia中的第一行代碼。 – Frozendragon

+0

如果是這樣,並且你不能改變函數簽名,我相信不可能改變傳入的媒體數組。 – Rollie

0

你不需要delete [] tempArray;因爲tempArray實際上指向相同的內存塊。medias做後medias = tempArray;

你的功能將是內部消除工作線很好,但我認爲你知道你通過的是什麼Media* medias[]

相關問題