shared_ptr mit Vektor
Ich habe derzeit Vektoren wie:
vector<MyClass*> MyVector;
und ich Zugriff über
MyVector[i]->MyClass_Function();
Möchte ich nutzen shared_ptr
. Bedeutet das, dass alles, was ich zu tun ist, ändern meine vector
:
typedef shared_ptr<MyClass*> safe_myclass
vector<safe_myclass>
und ich kann weiterhin mit dem rest von meinem code, wie es vorher war?
Besser werden
Ok, aber wird shared_ptr<MyClass> erlauben Sie mir, zu replizieren, vector<MyClass*> statt Vektor<MyClass>? Ich bin nicht mit jedem Polymorphismus in meinem code.
Ausgezeichnet, dachte ich, so viel. Dank K-ballo
ein Zeiger auf einen Zeiger" wäre SMART-pointer zu pointer.
shared_ptr<MyClass>
Ok, aber wird shared_ptr<MyClass> erlauben Sie mir, zu replizieren, vector<MyClass*> statt Vektor<MyClass>? Ich bin nicht mit jedem Polymorphismus in meinem code.
shared_ptr<MyClass>
ist ein Zeiger, um eine bereits freigegebenen Zeiger auf eine MyClass
Objekt. shared_ptr<MyClass*>
wäre ein Zeiger auf einen Zeiger, oder die raw-äquivalent MyClass**
.Ausgezeichnet, dachte ich, so viel. Dank K-ballo
ein Zeiger auf einen Zeiger" wäre SMART-pointer zu pointer.
InformationsquelleAutor user997112 | 2012-05-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
vector<shared_ptr<MyClass>> MyVector;
sollte OK sein.Aber wenn die Instanzen von
MyClass
werden nicht an Dritte außerhalb des Vektors, und verwenden Sie einen modernen C++11-compiler,vector<unique_ptr<MyClass>>
ist effizienter alsshared_ptr
(weilunique_ptr
nicht über die ref-Anzahl overheadshared_ptr
).Die nicht-Bestätigung der C++ - Compiler sind Sie?
Weiß ich ehrlich gesagt nicht, aber ich nennen den C++ Primer Buch (Auflage 5). Sie wiederholte diesen Satz mehrmals in dem Buch.
Es ist nicht eine nützliche Aussage überhaupt.
beruhigen Sie sich, es ist eine basic-Sprache-Funktion, die es in sechs C++11-Compilern, die es gibt, ich weiß, und dem, was Sie verteidigen, ist des Autors subjektive, unbegründete Meinung.
InformationsquelleAutor
Wahrscheinlich nur
std::vector<MyClass>
. Sind SieWenn ja, dann shared Pointer sind der Weg zu gehen, aber oft Menschen verwenden das Paradigma, wenn es nicht profitieren Sie auf allen.
Vollständig zu sein, wenn Sie nicht ändern, um
std::vector<MyClass>
Sie müssen möglicherweise einige hässliche Wartung zu tun, wenn Ihr code wird später polymorphe, sondern im Idealfall alle Veränderung, die Sie benötigen würde, ist die änderung der typedef.Zusammen, die zeigen, kann es sinnvoll sein, wickeln Sie Ihre gesamte std::vector.
So können Sie sicher Auswechseln und nicht nur die freigegebenen Zeiger, sondern der gesamte Vektor. Trade-off ist schwerer zu input-APIs, die erwarten, dass ein Vektor, aber die sind schlecht konzipiert, wie Sie sollten arbeiten mit Iteratoren, die Sie bieten können für Ihre Klasse.
Wahrscheinlich ist dies zu viel Arbeit für die app (obwohl, es wäre klug, wenn es Los zu werden, ausgesetzt, in einer Bibliothek mit Blick auf den Kunden), aber gelten diese überlegungen.
würde eine verknüpfte Liste machen mehr Sinn als ein container als ein Vektor dann?
Scheint als hättest du einige Tippfehler und verwendet eine C# - syntax:
private
undpublic
werden sollte, gefolgt von ":".InformationsquelleAutor djechlin
Nicht sofort springen, um shared Pointer. Sie könnte besser geeignet sein, mit einem einfachen Zeiger-container wenn Sie brauchen, um zu vermeiden, kopieren von Objekten.
InformationsquelleAutor Inverse