Nur eine konzeptionelle Frage, in die ich hineingeraten bin. In meinem aktuellen Projekt fühlt es sich so an, als ob ich die Boost-Bibliotheken smart_ptr
und ptr_container
überbeansprucht habe. Ich habe boost::ptr_vectors
in vielen verschiedenen Objekten erstellt und die Methode transfer() aufgerufen, um bestimmte Zeiger von einem boost::ptr_vector
auf einen anderen zu verschieben.Sollte boost :: ptr_vector an Ort und Stelle std :: vector die ganze Zeit verwendet werden?
Es ist mein Verständnis, dass es wichtig ist, das Eigentum von Heap allokierten Objekten deutlich zu zeigen.
Meine Frage ist, wäre es wünschenswert, diese Boost-Bibliotheken verwenden, um Heap-allokierte Mitglieder, die zu einem Objekt gehören, aber dann normale Zeiger auf diese Mitglieder über get()
bei der Durchführung einer Verarbeitung zu verwenden.
Zum Beispiel ... Ein Spiel könnte eine Sammlung von Tiles haben, die dazu gehören. Es könnte sinnvoll sein, diese Kacheln in einem boost::ptr_vector
zu erstellen. Wenn das Spiel beendet ist, sollten diese Kacheln automatisch freigegeben werden.
Allerdings, wenn ich diese Fliesen in Beutel Objekt setzen wollen vorübergehend, sollte ich eine andere boost::ptr_vector
in der Tasche erstellen und übertragen Sie die Fliesen des Spiels an die Tasche über transfer()
oder sollte ich eine std::vector<Tile*>
, wo die Fliesen * 's Referenz erstellen die Fliesen im Spiel und das an die Tasche weitergeben?
Danke.
** Edit Ich sollte darauf hinweisen, dass in meinem Beispiel das Spiel ein Bag-Objekt als Mitglied haben würde. Die Tasche würde nur mit Spielsteinen gefüllt werden, die das Spiel besitzt. Also würde die Tasche ohne das Spiel nicht existieren.
Warum sind Ihre Objekte in erster Linie Heap-allokiert? Da sind die ersten Alarmglocken für mich. 'ptr_vector' ist eine großartige Lösung in den * seltenen * Fällen, in denen Zeiger auf Heap-allokierte Objekte gespeichert werden müssen. Aber wenn diese Fälle nicht (sehr) selten sind, dann machst du es falsch. ;) Wenn das Spiel eine Sammlung von Tiles hat, lege * sie * in den Vektor. Zeig ihnen keine Hinweise darauf. – jalf
Die Antworten auf diese Frage sind ziemlich veraltet, wenn Sie eine C++ 11-Implementierung haben. Zum Beispiel gibt es keinen Grund für die Klassen ptr_x in C++ 11. Die Standardcontainer benötigen nur ihren Inhalt, um beweglich zu sein, was bedeutet, Container von ':: std :: unique_ptr's sind der Weg dafür. – Omnifarious
@jalf Ich bin verwirrt. Wenn ich also einen Vektor eines komplexen Objekts (z. B. aus einer Datei) auffüllen muss, sollte ich ihn nicht immer auf dem Heap zuweisen? Wenn ich es nicht in den Heapspeicher zuteile, sollte das Objekt kopierbar sein und das gesamte Objekt in den Vektor kopiert werden. Also, wenn ich das richtig befolge, ist es normalerweise besser, die Kosten für die Kopie zu tragen, als ein shared_ptr zu benutzen, oder? Und normalerweise möchten Sie nur dann ptr_container verwenden, wenn das Objekt nicht kopierbar ist? – Jerahmeel