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++;
}

このコードは関数内ではうまく機能しますが、関数の外に出ても配列はまだ空です。私がこれを理解しているように、関数内でポインターが変更されているためですが、ポインターを変更せずに配列を拡張するにはどうすればよいですか?

(戻り値のデータ型やパラメータ、代入要件は変更できません。)

4

3 に答える 3

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;
}
于 2012-05-14T18:12:05.777 に答える
2

に変更medias = tempArray;*medias = tempArray;、コンパイルし、メモリ管理を洗練します (実際に解放すべきものとそうでないものを検討してください)。

于 2012-05-14T18:00:50.537 に答える
0

後で行うのと同じメモリブロックを実際に指しているdelete [] tempArray; ため、必要ありませんtempArraymediasmedias = tempArray;

あなたの関数はその行がなくてもうまく機能しますが、何を渡すかを知っていると思いますMedia* medias[]

于 2012-05-14T18:34:35.093 に答える