Nodes: rekursiver Funktionsaufruf
-
Hallo,
habe mal eine Frage zu einem Problem, bei dem ich gerade auf dem Schlauch stehe...Ich habe ein Basisinterface, IControl. Man kann nun beliebig viele Controls erstellen, u.A. auch Nodes. Somit sollen Ebenen möglich sein, nach dem Motto:
Kategorie 1 -> Subkategorie 1 -> Control 1
Kategorie 2 -> Control 2Problem ist nun - wie kriege ich von ganz oben heraus (also vom obersten Node), wie tief das maximal gehen kann?
Ich dachte an so etwas, wie bei INode eine Funktion mit "int GetMaxDepth" zu implementieren. Dazu hat jedes IControl dann noch die Funktion "bool HasDepth()" (damit das ganze dynamisch bleibt). Doch was muss GetMaxDepth jetzt tun, um herauszufinden, wie tief zum Beispiel Kategorie 1 geht?
Es ist vermutlich einfach; und ich finde die Lösung einfach nicht?!
-
Straight forward: Rekursiv die Hierachie durchlaufen und dabei die tiefste Hierachiestufe bestimmen. Könnte etwa so aussehen:
unsigned int IControl::get_depth() const { unsigned int Depth = 0; foreach( Child in Children ) { Depth = max( Depth, Child.get_depth() ); } return Depth +1; }
-
Ich sehe 2 Möglichkeiten:
a) Jedes IControl soll gefragt werden können, wie tief ein eventueller Subbaum geht.
b) Nur Nodes sollen gefragt werden können.a):
class IControl { public: virtual unsigned getSubControlDepth() { return 1; //default: nur dieses Control } }; class INode : public IControl { vector<IControl*> children; public: virtual unsigned getSubControlDepth() { return 1 + std::accumulate(children.begin(), children.end(), 0u, [](unsigned old, IControl* rhs){ return std::max(old, rhs->getSubControlDepth()); }) } };b):
class INode : public IControl { vector<IControl*> children; public: unsigned getSubControlDepth() { if (children.empty()) return 1; return 1 + std::accumulate(children.begin(), children.end(), 1u, [](unsigned old, IControl* rhs) -> unsigned { INode* pNode = dynamic_cast<INode*>(rhs); unsigned sub = pNode ? std::max(old, pNode->getSubControlDepth()) : old; }) } };Erstmal nur so hingerotzt - geht sicher auch eleganter.
-
So einfach... Danke!