Ich versuche, eine Hausaufgabe in C++ zu machen, wo ich keine STD - Container - Klassen wie Vektoren, Karten usw. Angenommen, wir das folgende Archiv haben:Die Größe eines Arrays von Objekten ändern
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
Für Erklärungszweck läßt vermuten, die Zahl 2 bedeutet, dass ein Buch von X Kategorie ist, in diesem Fall zwei Mittel ist eine Fiktion Buch, die nächste Zeile nach 2 ist nur der Grund Buchdaten (Name, Autor, Verlag, isbn, Jahr, Preis) und die nächste Zeile danach ist nur etwas, was wir CCF nennen, das ist nur ein weiterer Code für diese Art von Büchern aus der Fiction-Kategorie.
Ich bin nur auf den nächsten folgenden Teil stecken, ich weiß, wie man ein Array von Objekten ohne Container-Klassen erstellen, aber ich weiß nicht, wie diese Größe ändern, ich habe von Realloc gehört, aber ich weiß nicht, wie man es mit Objekt-Array-Typen verwendet. Libro ist der Vater von Ficcion und ich versuche, Ficcion-Typen in einem polymorphen Array von Libro zu speichern, weil ich später mehr Klassen im selben Array einführen muss, aber zu Lernzwecken versuche ich nur mit der Ficcion-Klasse zu skalieren Ich weiß, dass der nächste folgende Code falsch ist, weil ich malloc benutze und das Child-Objekt mit new neu zuordne und dann neu zuweiße, aber wie gesagt, ich bekomme nicht wirklich, wie man das überhaupt macht, wenn du es tust Sieh dir den Code an, den du erkennen kannst, dass ein neues Child-Objekt alle 3 Male inFile erstellt wurde. Wenn du denkst, dass etwas fehlt, lass es mich wissen, aber ich denke, dass das, was ich aufgedeckt habe, die Hauptprobleme dieser Frage abdeckt. Ich frage nur nach Aufklärung, wenn Sie mit diesen Arten von Arrays umgehen müssen, und Sie müssen die Größe ändern, und ich weiß auch, dass dies mit der Container-Klasse viel einfacher wäre, aber ich kann es diesmal nicht verwenden . Danke im Voraus! Hab einen tollen Tag/Nacht!
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 Lösung: Da es sich um ein Array von Zeigern, wie vorgeschlagen unten i eine Funktion erstellt, wo sie es ändert die Größe und löscht die alte, die neue mit dem alten Daten zurückkehr und ein freier Speicherplatz. Bis jetzt funktioniert das, vielen Dank!
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;
}
Sie können die Größe eines Arrays nicht ändern. Alles, was Sie tun können, ist ein neues Array zu erstellen, die Daten zu kopieren und das alte zu löschen. – immibis
In C++ verwenden Sie 'new' und' delete' wenn Sie müssen, nicht 'malloc'. Verwenden Sie 'unique_ptr' und' make_unique', wenn Sie können. – Thomas
In Ordnung! Das bestätigt meine Gedanken, vielen Dank! Ich dachte nur, wenn es einen "lebensfähigeren" oder effizienteren Weg durch irgendeine Funktion gibt, die ich noch nie von – NeptaliD