Ich bin nicht sicher, ob ich mehr von einem Dokumentationsfehler oder Kopfschmerzen leiden, so ...Wie kann ich ein shared_ptr zu einem Mitglied erstellen?
Was ich will ist zu tun, um eine shared_ptr zu schaffen, dass mit einem anderen Aktie Eigentum, das aber verweist auf ein Mitglied das Objekt anstelle des gesamten Objekts. Einfaches Beispiel, Ausgangspunkt ...
struct s
{
int a, b;
};
shared_ptr<s> s1 (new s); // pointing to whole object
Von en.cppreference.com, Konstruktor (8) von shared_ptr ist ...
template< class Y >
shared_ptr(const shared_ptr<Y>& r, T *ptr);
Die Beschreibung erwähnt „ein shared_ptr Konstrukte, die Eigentümerinformationen mit r teilt, aber enthält einen nicht verwandten und nicht verwalteten Zeiger ptr ... wie in den typischen Anwendungsfällen, in denen ptr ein Mitglied des von r verwalteten Objekts ist.
Also ... Wurde T
gerade versehentlich von der Vorlage in diesem Konstruktor verpasst, oder fehle ich etwas? In der Tat sieht Y aus, als wäre es auch falsch für mich, also wird der Konstruktor in der Regel korrekt beschrieben?
Was ich hoffe, dass ich tun kann, so etwas wie dieses ...
shared_ptr<int> s2 (s1, &(s1.get()->a));
s2
Punkte Mitglied a
(ein int
), aber Aktien Besitz des gesamten Objekts mit s1
.
Ist das gesund?
Vielleicht bin ich etwas fehlt, aber warum sollte man eine shared_ptr an ein Mitglied var möchten, die nicht zugeordnet auf dem Haufen? also warum nicht einfach einen rohen Zeiger für s2 benutzen? –
@RC - um sicherzustellen, dass, wenn die ursprüngliche shared_ptr freigegeben wird, das Objekt selbst nicht - dh um sicherzustellen, dass s2 nicht zu einem dangling Zeiger wird. In einem realen Beispiel sind die Bereiche von s1 und s2 nicht identisch. – Steve314
Ja, es ist vollkommen gesund. Sie brauchen auch kein '.get()'. – atzz