2016-03-20 4 views
-4

Я пытаюсь выполнить домашнюю работу в C++, где я не могу использовать классы контейнеров STD, такие как вектор, карта и т. Д. Предположим, мы имеем следующий архив:Изменение размера массива объектов

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 и выделяю дочерний объект новым, а затем перераспределяя, но, как я уже сказал, я действительно не понимаю, как это сделать, если вы см. код, который вы можете сказать, что новый дочерний объект создается каждые 3 раза. inFile выполнил getline, если вы считаете, что что-то отсутствует. Пожалуйста, дайте мне знать, но я думаю, что я раскрыл основные вопросы этого вопроса. Я просто прошу просветить информацию, когда вам приходится иметь дело с этими типами массивов, и вам нужно изменить их размер, и я также знаю, что это было бы проще с классом контейнера, но я не могу использовать его на этот раз , Заранее спасибо! иметь отличный день/ночь!

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(); 

}

решение

UPDATE: Поскольку это массив указателей, как это было предложен внизу я создал функцию, где она изменяет размер его и удаляет старую, возвращая новый со старыми данными и свободное место для хранения. Пока это работает, спасибо много парней!

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; 

}

+0

Вы не можете изменить размер массива. Все, что вы можете сделать, это создать новый массив и скопировать данные и удалить старый. – immibis

+0

В C++ используйте 'new' и' delete', если вам нужно, а не 'malloc'. Используйте 'unique_ptr' и' make_unique', если сможете. – Thomas

+0

Хорошо! это подтверждает мои мысли, спасибо огромное! Я просто подумал, есть ли более «жизнеспособный» или эффективный способ через какую-то функцию, о которой я никогда не слышал – NeptaliD

ответ

2

таНос, перераспределить и т.д .. являются функциями библиотеки C. Ваш вопрос несет тег C++, а не C.

В C++ объекты выделены new и освобождены от delete. Сюда входят массивы.

Чтобы изменить размер существующего массива, вы используете new для выделения нового массива с новым размером, скопируйте в него элементы в существующем массиве, а затем освободите старый массив с помощью delete.

(Это не соответствует действительности на 100%, но это, скорее всего, то, что вы ожидаете делать как часть своего задания).

+2

"... освободить старый массив с помощью' delete' "- на самом деле это' delete [] ' – WhozCraig

+1

Большая часть стандартной библиотеки C также является частью C++.'malloc' может использоваться для некоторых вещей на C++. –

Смежные вопросы