std :: Vektor von Referenzen
Habe ich das problem: ich habe Klasse Foo
, und wenn einige Objekte dieser Klasse,
Foo a();
Ich dieses Objekt auf 2 verschiedene Vektoren:
std::vector<Foo> vA, vB;
und wenn a
änderungen in vA
es sollte geändert werden in vB
Vektoren vA
und vB
können unterschiedlich sein, aber Sie können dieselben Objekte. Ich weiß, dass es möglich ist, mit Boost, aber ich kann nicht die Verwendung von Boost.
Kommentar zu dem Problem - Öffnen
Meinst du zu
std::vector<std::shared_ptr<Foo>>
? Bitte beachten Sie, dass eine Deklaration wie
Foo();
nicht tun, was Sie denken, es tut. Es ist eigentlich eine Erklärung der Funktion a
nimmt keine Argumente und gibt eine Foo
- Objekt. Nicht sicher, ob das, was
Foo()
ist soll zu bedeuten, aber es deklariert eine Funktion mit dem Namen a
, die Rückgabe Foo
. InformationsquelleAutor der Frage Mike Minaev | 2014-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einige Möglichkeiten:
Speichern von einem Vektor von Zeigern (verwenden, wenn Ihre Vektoren Aktienbesitz der Zeiger):
Store einen Vektor verpackt Verweise (verwenden, wenn die Vektoren nicht zu eigen der Zeiger, und Sie wissen das Objekt referenziert sind gültig über die Lebensdauer der Vektoren):
Speichern von einem Vektor von raw-Pointer (verwenden, wenn Ihre Vektoren nicht teilen Eigentum des Zeiger, und/oder der Zeiger gespeichert, ändert sich möglicherweise abhängig von anderen Faktoren):
Dies ist üblich, Beobachtung, Verfolgung der Zuweisungen, etc. Die üblichen Vorsichtsmaßnahmen für raw-Pointer anwenden: verwenden Sie nicht die Zeiger auf die Objekte zugreifen, die nach dem Ende Ihrer Lebensdauer.
Speichern von einem Vektor von
std::unique_ptr
, wickeln Sie die Objekte (verwenden, wenn Ihre Vektoren wollen übergabe das Eigentum des Zeiger, in dem Fall die Lebensdauer der referenzierten Objekte unterliegen den Regeln derstd::unique_ptr
Klasse):InformationsquelleAutor der Antwort utnapistim
Benötigen Sie einen Vektor, der Referenzen. Und da Sie angeben, müssen Sie die Verwendung von std::vector, dann ist die richtige Sache zu tun ist, wickeln Sie Ihre Objekte in der
std::reference_wrapper
. Diese Seite von C++ - Referenz sollte erklären, dass es schön:InformationsquelleAutor der Antwort alpartis
Anstatt zu halten Foo als Objekt zu halten, als Zeiger auf Objekt Foo, z.B.
und verwalten von Zuweisungen und deallocations sorgfältig zu vermeiden Speicher Leckage (Zuweisung, aber nicht freigeben, wenn Sie fertig). Wenn Sie reservieren ein Foo-Objekt und halten Sie den Zeiger in beide vA und vB , dann sind Sie halten im wesentlichen dasselbe Objekt in beiden durch die Zeiger.
Sonst können Sie mithilfe der smart-pointer (besser)
siehe:
Was ist ein smart-pointer und Wann sollte ich Sie verwenden?
InformationsquelleAutor der Antwort Dr. Debasish Jana