2016-03-20 17 views
-4

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; 

}

+0

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

+0

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

+0

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

Antwort

2

malloc, realloc, etc .. sind C-Bibliotheksfunktionen. Ihre Frage trägt das C++ Tag, nicht C. In C++ werden Objekte mit new zugewiesen und mit delete freigegeben. Dies beinhaltet Arrays.

Um die Größe eines vorhandenen Arrays zu ändern, verwenden Sie new, um ein neues Array mit der neuen Größe zuzuweisen, kopieren Sie die Elemente in das vorhandene Array, und heben Sie dann das alte Array mit delete auf.

(Dies ist nicht 100% technisch wahr, aber das ist wahrscheinlich, was Sie als Teil Ihrer Aufgabe tun sollen).

+2

"... das alte Array mit' delete' aufheben - eigentlich ist das 'delete []' – WhozCraig

+1

Die meisten der C-Standardbibliothek sind auch Teil von C++.'malloc' kann für einige Dinge in C++ verwendet werden. –

Verwandte Themen