T
vivess schrieb:
2.3.5 void resize(int newCapacity)
Ein Aufruf von resize vergrößert das Array eines DynArray-Objekts. Diese Funktion wird nur intern verwendet und ist
daher private. Um ein bestehendes Array zu vergrößern m¸ssen Sie folgende Schritte durchführen:
1. Erzeugen eines neuen dynamischen Arrays der Größe newCapacity
2. Kopieren der Daten aus dem bestehenden Array in das neu erzeugte
3. Löschen des bestehenden Arrays
4. Den m_data-Zeiger auf das neu erzeugte Array setzen
Ich versteh aber nicht wie ich das machen soll. Meine DynArray(int new Capacity) funktion sieht so aus:
DynArray::DynArray(int newCapacity)
{
m_data = new Lied[newCapacity];
m_capacity = newCapacity;
m_size=0;
}
Aber wenn ich wie in der aufgabenstellung für das resize im Schritt 1 ein neues array anlege, wird ja der zeiger m_data direkt auf das neue array gerichtet, aber im 4. Schritt steht dann auf einmal ich soll den m_data zeiger auf das neu erstellte array richten, aber das mach ich doch schon sofort?
Was ist mit Schritt 2? Um etwas kopieren zu können, muss zumindest bis die Kopie erstellt ist noch das Original vorhanden sein (m_data darf also nicht sofort neu zugewiesen werden, sonst ist es weg). Du musst genau das tun, was oben in den Schritten 1 - 3 beschrieben ist. "Resize" wird demnach so ähnlich arbeiten wie der Konstruktor, aber mit ein paar zusätzlichen Schritten.
Außerdem noch:
cout<<a.m_data->titel;
Wenn a ein Array ist dann fehlt beim Zugriff auf die Daten irgendwie noch die Angabe eines Indexes. Woher soll dein Array wissen, welches Lied du genau haben möchtest, z.B.
cout<<a.getLied(0)->titel;
Ich lerne ja auch gerade C++ und wenn ich Probleme an einer Stelle habe, dann versuche ich erst mal mit einem vereinfachten Beispiel das Problem zu lösen. Anschließend erweitere ich die Lösung auf das ursprüngliche Problem.
Bastel dir doch erst mal ein dynamisches Array für einfache Datentypen:
class IntArray
{
public:
IntArray(int capacity);
~IntArray(); // destructor nicht vergessen, um das interne array wieder freizugeben!
void pushBack(int value);
int get(int index);
private:
int* array = nullptr;
int size = 0;
int capacity = 0;
void resize(int newCapacity);
};
Wenn das funktioniert:
int main(int argc, char *argv[])
{
IntArray ints(10); // startgröße 10
for (int i = 1; i <= 100; i++) // 100 werte einfügen
{
ints.pushBack(i);
}
std::cout << "the answer to all: " << ints.get(41) << std::endl; // ganz wichtig ;)
return 0;
}
dann kannst du den Datentypen ja auf Lieder ändern.
Schau dir auch im Debugger Schritt für Schritt an, was dein Programm macht oder lass dir zur Kontrolle in den einzelnen Methoden etwas auf die Konsole ausgeben:
void IntArray::pushBack(int value)
{
std::cout << "pushBack begin, capacity: " << capacity << " size: " << size << std::endl;
if (capacity <= size)
{
resize(capacity + 10); // resize array +10
}
array[size++] = value;
std::cout << "pushBack done, capacity: " << capacity << " size: " << size << std::endl;
}
...
pushBack begin, capacity: 10 size: 8
pushBack done, capacity: 10 size: 9
pushBack begin, capacity: 10 size: 9
pushBack done, capacity: 10 size: 10
pushBack begin, capacity: 10 size: 10
resize done, capacity: 20 size: 10
pushBack done, capacity: 20 size: 11
pushBack begin, capacity: 20 size: 11
pushBack done, capacity: 20 size: 12
pushBack begin, capacity: 20 size: 12
pushBack done, capacity: 20 size: 13
pushBack begin, capacity: 20 size: 13
pushBack done, capacity: 20 size: 14
...