2017-10-18 11 views
3

Wenn ich einen binären Baum habe, wo jeder Knoten nur Zeiger auf Kinderknoten enthält, dann funktioniert sehr gut. Wenn ich möchte, dass jeder Knoten einen Elternzeiger hat, dann ist die Situation nicht so nett, da ein Knoten möglicherweise drei Zeiger hat: Binary Tree with parent pointerSmart Pointer für Binärbaum

Was kann ich in diesem Fall tun? Ich kann für alles verwenden, aber mir wurde gesagt, dass es kein gutes Design ist, da ich Zyklen bekommen kann. Wenn ich eine weak_ptr für den Elternzeiger verwenden würde, welche shared_ptr erstelle ich diese weak_ptr aus?

Ich fange an zu denken, dass einfache integrierte Zeiger möglicherweise besser für dieses Problem geeignet sind. Jeder Rat wird sehr geschätzt.

+11

Es ist nichts falsch mit einem Paar 'std :: unique_ptr's und einem ** nicht-besitzen ** row-Zeiger auf das Elternteil. – StoryTeller

+7

In den meisten Fällen sollten Sie die Smart Pointer nicht als einfache selbstlöschende Pointer, sondern als Ownership Primitive sehen.Kann eine "Ressource" nur einen einzigen Besitzer (mit 'std :: unique_ptr') oder mehrere gleichzeitige Besitzer (mit' std :: shared_ptr') haben? –

+0

Vielleicht bin ich alleine hier, aber die ganze Idee der Verwendung von Smart Pointer innerhalb der btree-Implementierung ist nicht die beste. Ich sehe kein Problem mit rohen Zeigern innerhalb einer konkreten Klasse, die Sie kontrollieren können. Auch das Konzept "Besitzer sein" ist nicht einfach (imho gibt es mehr als eine "intuitive" Sichtweise) an einen Baum gebunden. Wenn Sie später einige Graph-Operationen implementieren möchten, wird es wahrscheinlich ein Chaos werden. –

Antwort

4

Wenn ich einen binären Baum, wo jeder Knoten nur Zeiger auf Kinder Knoten enthalten, dann unique_ptr funktioniert sehr gut.

Richtig.

Wenn ich jeden Knoten wollen einen Abstammungszeiger haben, dann ist die Situation nicht so schön, da ein Knoten

haben

es drei Zeiger zeigen Sie sollten Zeiger unterscheiden zwischen besitzen Zeiger und beobachten Zeiger.

Mit rohbesitzen Zeiger ist eine schlechte Idee und eine Quelle von Bugs und Lecks; Auf der anderen Seite mit roheBeobachtung Zeiger können in vielen Fällen in Ordnung sein (solange das beobachtete Objekt ist immer noch "live").

In Ihrem Fall können Sie ein Design betrachten, in dem jeder Knoten unique_ptr s Kinderknoten enthält, da diese besitzen Zeiger sind, und einen intelligenten besitzenden Zeiger wie unique_ptr funktioniert gut in diesem Fall verwendet wird.

Auf der anderen Seite, die Kinder-Knoten ihre Eltern mit einem Nicht-Besitz Zeiger (die Kinder „nicht besitzen“ ihre Eltern, Knoten, die die Kinder nur ihre Eltern beobachten) beziehen, und ein roher Zeiger funktioniert gut als nicht-Besitz Beobachtung Zeiger.

Als Randbemerkung, wenn/falls Sie verwenden shared_ptr Sie die Aufmerksamkeit auf Zyklen zahlen müssen, als ob Sie Pause nicht richtig tun sie, dann haben Sie Lecks (unreleased Objekte). Auf der anderen Seite scheint der Elternteil auf Kinder über unique_ptr s, und die Kinder ihre Eltern über rohe Beobachtungszeiger zu beobachten, scheint ein einfacheres Design für mich.

+0

Danke. Ich dachte, eingebaute Zeiger waren immer schlecht (mit Ausnahme von Funktionszeigern). Aber es macht viel mehr Sinn, über den Besitz und das Beobachten von Zeigern nachzudenken. Schwache Zeiger und eingebaute (dumme) Zeiger sollten zum Beobachten verwendet werden. Eindeutige und geteilte Zeiger für den Besitz. Vielen Dank, das ist mir viel klarer. – RonnyZed

+0

@RonnyZed Gern geschehen. Ich bin froh, dass ich Hilfe hatte. –