调整对象数组的大小

时间:2016-03-20 21:42:17

标签: c++ arrays realloc

我试图在c ++中做作业,我不能使用STD容器类,如vector,map等。假设我们有以下存档:

2
El juego de Ender-Orson Scott-Tor Books-980.275.246-1985-6000
890365.2
2
The following-Lily Tyler-Tor Books-980.275.246-1985-6000
890365.2

为了便于说明,我们假设数字2表示一本书来自X类,在这种情况下,2表示是一本小说,2之后的下一行只是基本书籍数据(名称,作者,出版社,isbn) ,年,价格)以及之后的下一行只是我们打算称之为CCF的东西,它只是小说类别中这些类型书籍的另一个代码。

我只是坚持下一部分,我知道如何创建没有容器类的对象数组,但我不知道如何调整此数组的大小,我听说过realloc ,但我不知道如何将它与对象数组类型一起使用。 Libro是Ficcion的父母,我试图将Ficcion类型存储在Libro的多态数组中,因为后来我必须在同一个数组中引入更多类,但出于学习目的,我试图调整大小只是ficcion类,据说,我知道下面的代码是错误的,因为我使用malloc并将子对象分配给new然后重新分配,但正如我所说,我不知道如何如果你看到代码,你可以告诉你每隔3次创建一个新的子对象inFile已经执行了getline,如果你认为有些东西丢失了请告诉我,但是我认为我是&#39暴露涵盖了这个问题的主要问题。当你必须处理这些类型的数组并且你需要调整它们的大小时,我只是要求一些信息的启发,我也知道这对容器类来说会更容易,但我不能这样做这次使用它。提前致谢!有一个美好的一天/晚上!

void BookManager::dataLoading(char* fileName){

//Arbitrary size to be resized later on (this is the array declared as **libro in the .h file)
libros = (Libro**)malloc(1 * sizeof(Libro**));

//file-in variable
std::ifstream inFile(fileName);

char type[10];

//counter
int i = 0;

//First getline
while (inFile.getline(type,sizeof(inFile)) && i < 2){

    //Book Info; Second Getline
    char bookInfo[100];
    inFile.getline(bookInfo, sizeof(inFile));

    //Additional book information; Third getline
    char additional[60];
    inFile.getline(additional, sizeof(inFile));

    //Child creation

    if (type[0] == '2'){

        this->separateData(bookInfo);
        //Ficcion constructor creating an object to store in the libros polymorphic array
        libros[i] = new Ficcion(this->bookData[0], this->bookData[1], this->bookData[2], atof(this->bookData[3]), atoi(this->bookData[4]), atoi(this->bookData[5]), atof(additional));


    }


    i++;
    //Failed reallocating
    libros = (Libro**)realloc(libros, i+1 * sizeof(Libro**));



}
// This one is just testing if the array worked but i get an unhandled exception when i=1; 
for (int i = 0; i < 2; i++){
    std::cout << libros[i]->getTitulo() << '\n';
}

inFile.close();

}

更新解决方案: 因为这是一个指针数组,如下所示,我创建了一个函数,它调整它的大小并删除旧的函数,返回带有旧数据和存储空闲空间的新函数。到目前为止,这是有效的,非常感谢!

Libro** BookManager::resize(Libro** arr,int size){

Libro** resized = new Libro*[size];

for (int i = 0; i < size-1; i++){
    resized[i] = arr[i];
}

delete[]arr;

return resized;

}

1 个答案:

答案 0 :(得分:2)

malloc,realloc等..是C库函数。您的问题带有C++标记,而不是C

在C ++中,对象分配new,并用delete解除分配。这包括数组。

要调整现有数组的大小,可以使用new分配一个具有新大小的新数组,将现有数组中的元素复制到其中,然后使用delete解除分配旧数组。 / p>

(这在技术上并非100%正确,但这可能是您在作业中应该做的事情。)