std :: shared_ptr davon
Ich bin derzeit versuchen zu lernen, wie man smart-Pointer. Doch während dabei einige Experimente entdeckte ich die folgende situation, für die ich nicht finden konnte, ein satifying Lösung:
Stellen Sie sich vor Sie haben ein Objekt der Klasse A als Elternteil eines Objekts der Klasse B (das Kind), aber beide sollten einander kennen:
class A;
class B;
class A
{
public:
void addChild(std::shared_ptr<B> child)
{
children->push_back(child);
//How to do pass the pointer correctly?
//child->setParent(this); //wrong
// ^^^^
}
private:
std::list<std::shared_ptr<B>> children;
};
class B
{
public:
setParent(std::shared_ptr<A> parent)
{
this->parent = parent;
};
private:
std::shared_ptr<A> parent;
};
Die Frage ist, wie kann ein Objekt der Klasse Einen pass, eine std::shared_ptr
von sich selbst (this
) zu seinem Kind?
Gibt es Lösungen für die Boost-shared-Pointer (Immer einem boost::shared_ptr
für this
), aber zu behandeln, wie dies mit der std::
smart Pointer?
Kommentar zu dem Problem
Ist wie mit jedem anderen Werkzeug, das Sie haben, es zu benutzen, wenn es angebracht ist. Die Verwendung von smart-Pointer für das, was Sie tun, ist nicht
Ähnlich wie boost. Siehe hier.
Dies ist ein problem auf dieser Ebene der Abstraktion. Sie wissen gar nicht, dass "dies" weist auf Speicher auf dem heap.
Gut, die Sprache nicht, aber Sie zu tun. Solange Sie verfolgen, was, wo, du wirst in Ordnung sein.
InformationsquelleAutor der Frage Icarus | 2012-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist
std::enable_shared_from_this
nur für diesen Zweck. Sie Erben von es und Sie können aufrufen,.shared_from_this()
aus dem inneren der Klasse. Auch erstellen Sie zirkuläre Abhängigkeiten hier kann dazu führen, dass Ressourcen-Lecks. Das kann behoben werden mit dem Einsatz vonstd::weak_ptr
. Also der code könnte so Aussehen (vorausgesetzt, die Kinder verlassen sich auf die Existenz der Eltern und nicht Umgekehrt):Beachten Sie jedoch, dass der Aufruf
.shared_from_this()
erfordert, dassthis
ist im Besitz vonstd::shared_ptr
am point-of-call. Dies bedeutet, dass Sie nicht erstellen kann solches Objekt auf stack mehr, und in der Regel nicht nennen.shared_from_this()
in einem Konstruktor oder Destruktor.InformationsquelleAutor der Antwort yuri kilochek
Haben Sie mehrere Probleme in man-design, das scheint stem von Ihnen Missverständnis smart pointers.
Intelligente Zeiger verwendet, um zu deklarieren Eigentum. Brechen Sie diese, indem Sie erklärt, dass sowohl die Eltern als Eigentümer aller Kinder, aber auch, dass jedes Kind die eigenen Eltern werden. Beide können nicht wahr sein.
Auch, das Sie wieder eine schwache Zeiger in
getChild()
. Indem Sie dies tun, erklären Sie, dass der Anrufer sollte sich keine Gedanken über das Eigentum. Nun das kann sehr einschränkend sein, aber auch indem Sie das tun, müssen Sie sicherstellen, dass das Kind in Frage kommen die nicht zerstört wird, während eine schwache Zeiger sind noch gehalten, wenn Sie mit einem smart-pointer, wäre es sortiert sich von alleine aus.Und die Letzte Sache. Normalerweise, wenn Sie die Annahme neuer Entitäten, sollten Sie akzeptieren in der Regel raw-Pointer. Smart-pointer können haben Ihre eigene Bedeutung für das austauschen von Kinder zwischen die Eltern, sondern für Allgemeine Verwendung, Sie sollten akzeptieren, raw-Pointer.
InformationsquelleAutor der Antwort Let_Me_Be