Я пытаюсь выполнить домашнюю работу в 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;
}
Вы не можете изменить размер массива. Все, что вы можете сделать, это создать новый массив и скопировать данные и удалить старый. – immibis
В C++ используйте 'new' и' delete', если вам нужно, а не 'malloc'. Используйте 'unique_ptr' и' make_unique', если сможете. – Thomas
Хорошо! это подтверждает мои мысли, спасибо огромное! Я просто подумал, есть ли более «жизнеспособный» или эффективный способ через какую-то функцию, о которой я никогда не слышал – NeptaliD