展开新对象并将其添加到函数内的数组中

Expand and add a new object to a array inside a function

本文关键字:函数 添加 数组 新对象 对象      更新时间:2023-10-16

我正在尝试扩展并向函数内的数组添加新对象,并使该数组也受到函数外部的影响(数组指针作为参数发送)。

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

这段代码在函数内部运行良好,但是当我在函数外部时,数组仍然是空的。据我了解,这是因为指针在函数内部发生了变化,但是如何在不更改指针的情况下扩展数组?

(我不能更改返回数据类型或参数,赋值要求。

medias = tempArray;更改为*medias = tempArray;,使其编译,完善您的内存管理(考虑一下,真正应该释放什么,什么不应该)。

不要将媒体视为指针数组,而应将其视为指向数组的指针。工作示例(略微简化):

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

你不需要delete [] tempArray;,因为tempArray实际上指向与mediasmedias = tempArray;之后相同的内存块

你的函数在这条线上工作得很好,但我假设你知道你传递了什么Media* medias[]