Wie schreibt man diesen CCtor?
-
Guten Abend!
Ich habe folgende struct:
struct Group { std::vector<Lock> locks; std::vector<Division> divisions; Group(); }; struct Lock { int id; Division* division; };Im Ctor Group::Group() werden nach bestimmten Regeln mehrere Lock und Division Objekte angelegt und in die vektoren locks und divisions abgelegt. Zusätzlich wird der Zeiger Lock::division von jedem Lock Objekt in dem vector auf ein Element im vector Group::divisions gesetzt. Sprich: Der Zeiger division jedes Lock Objekt zeigt auf ein Element von Group::divisions.
Ich glaube ich habe jetzt ein Problem mit dem Default erzeugten Copy Ctor von Group. Beispiel:
Group g1; Group g2(g1);Hier werden ja jetzt im CCtor die vectors kopiert und damit zeigen die ganzen Lock::division Zeiger auf die alten Division Elemente in g1. Wird g1 zerstört, habe ich Zeiger die auf Schrott zeigen. Stimmt das?
Wie könnte ich sowas lösen? Ich habe im kopieren Objekt ja nur die Info WO ein division Zeiger hinzeigt, aber ich weiß ja nicht auf welches Element er im neuen division vector (von g1) der Zeiger nun zeigen soll.

-
Du könntest natürlich einen Kopierkonstruktor schreiben, eine deutliche elegantere Lösung ist es aber anstattt Zeiger Indices zu speichern. Die ändern sich nämlich nicht.
-
Indexe speichern, wie Nathan geschrieben hat, ist sicher die bessere Möglichkeit!
Davon abgesehen, wenn du weisst dass der
Group::locks::divisionZeiger auf ein Element vonGroup::divisionsdes selbenGroupObjekts zeigt, dann kannst du mit einfacher Zeigerarithmetik ausrechnen auf welchen Index er zeigt:Group(Group const& other) : locks(other.locks), divisions(other.divisions) { // Patch pointers to point to *our* divisions vector for (size_t i = 0; i < locks.size(); i++) { // Compute index of element in other.divisions that other.locks[i].division points to size_t const index = other.locks[i].division - (&other.divisions[0]); // Compute address of the same element in OUR divisions vector locks[i].division = &divisions[index]; } }
-
Wow, das ging schnell.
Vielen dank euch beiden für die Lösungen!
