P
Hi,
ich bin gerade dabei, den Grundstein für eine Library zu legen.
Es geht um Bäume, und mein Ansatz sieht kurz so aus:
class ParentNode;
class Node
{
1) boost::weak_ptr<ParentNode> parent;
2) 3) ParentNode* parent;
4) ParentNode& parent;
};
class ParentNode : public Node
{
1) std::vector<boost::shared_ptr<Node> > children;
2) std::vector<Node*> children;
3) 4) boost::ptr_vector<Node> children;
};
Die Lösungen haben alle ihre Vor- und Nachteile, kurz beschrieben:
Der sicher nicht performanteste Ansatz, dafür aber ist sicher gestellt, das weak_ptr überprüfbar bleibt. Dies ist mir wichtig, weshalb dieser Ansatz auch an erster Stelle steht.
Ein einfacher Ansatz, mir jedoch zu unsympatisch, da nur RawPointer.
Hier bin ich gerade am nachdenken, könnte evtl. auch der elegantere Ansatz als 1. sein, aber ich bin mir nicht sicher, wie ich sicherstellen kann, das das Element immer erst dann gelöscht wird, wenn keine Referenzen/Abhängigkeiten mehr darauf bestehen.
Referenz statt Pointer in der basisklasse, sieht schick aus, da ich aber die Nodes im Baum umhängen will, wohl nicht der beste Ansatz. Zu mal sich hierfür noch eine 3. Klasse RootNode nötig wäre, wenn nicht eine Bedingung wie &parent == this als Rootbedingung festgelegt wird. Allerdings wäre mir ein NULL dort schon lieber.
Generell müsste ich für 2,3,4 noch schauen, wie ich einen Mechanismus implementiere, der schwache Pointer wie boost::weak_ptr ermöglicht, damit ich dies in meinem Modellen nutzen kann. Evtl. ließe sich diese Anforderung aber auch mit dem Observerpattern erschlagen.
Um möglichst flexibel zu sein, denke ich auch, das evtl. eine container_policy hilfreich wäre, welche dann als Templateparameter dort genutzt wird. Allerdings möchte ich auch verhindern, das die ganze Library aus templates besteht, welche jeweils die policyparameter anbieten. Von beiden Klassen werden viele Klassen abgeleitet werden, da dies ein besuchbarer Baum sein soll. Wobei sich auch eine visitor_policy evtl. lohnen würde.
Meine Frage ist nun, welche der 4 Möglichkeiten würdet ihr favorisieren, und wie kann ich das mit der Policy geschickt hinbiegen?
phlox