rekursive methoden verbinden
-
hallo,
wie kann ich folgende methoden miteinander verbinden, dass ich am ende nur eine habe (GetHierarchy) ?
void CExporter::GetChildren(BaseObject* obj, long level) { for(; obj; obj=obj->GetNext()) { DoParse(obj); GetChildren(obj->GetDown(), level+1); } }
void CExporter::GetHierarchy(BaseDocument* doc) { for(BaseObject* obj=doc->GetFirstObject(); obj; obj=obj->GetNext()) { DoParse(obj); GetChildren(obj->GetDown(), 1); } }
am ende will ich die so aufrufen:
GetHierarchy(doc);
-
Wie rufst du GetHierarchy denn jetzt auf? GetHierarchy(doc) vielleicht??
Und wenn du GetChildren unbedingt loswerden willst (warum?) dann pack die Implementation der Methode doch entsprechend angepasst an die Stelle wo du sie in GetHierarchy aufrufst...
Wie hast du es denn versucht, und woran bist du gescheitert??
-
ich rufe GetHierarchy(doc) jetzt genauso auf, nur will ich alles in einer Methode drin haben, wieso... das hat interne Problem, aber das spielt gerade keine rolle....
ich habe das bis jetzt versucht zu überlegen wie das aussehen könnte, nur verwirren mich diese rekursive aufrufe und da bin ich zu keiner lösung leider gekommen
-
hat keiner eine idee ?
das muss doch irgendwie gehen...
-
wenn du für alle objekte ein GetUp() (oder nur für das erste element jeder ebene ein gültiges GetUp() und für den rest ein GetPrev() ) hast, kannst du die hierarchie auch iterativ durchlaufen. allerdings finde ich die rekursive variante viel ausdrucksstärker, geschwindigkeitsvorteile dürften sich auch keine ergeben. das long level könntest du dir im übrigen sparen, das es ja nirgends verwendet wird.
-
irgendwie sagt jeder es müsste funktionieren, aber nicht wie und ich komme auf keine lösung
-
void CExporter::GetHierarchy(BaseDocument* doc) { BaseObject* obj = doc->GetFirstObject(); while( obj != NULL ) { DoParse( obj ); while( obj != NULL && obj->GetDown() == NULL && obj->GetNext() == NULL ) { obj = obj->GetUp(); } if( obj != NULL && obj->GetDown() != NULL ) { obj = obj->GetDown(); } else if( obj != NULL && obj->GetNext() != NULL ) { obj = obj->GetNext(); } } }
ungetestet und nur schnell reingehackt. geht davon aus, dass GetUp() angewendet auf das oberste level NULL liefert.
-
irgendwie kommt es zu einer entlosschleife....
PS: GetUp() liefert NULL, wenn kein parent element vorhanden ist
-
p.s. ich würde einfach mal nach depth-first iterativ suchen.
-
WeiseCoder schrieb:
irgendwie kommt es zu einer entlosschleife....
PS: GetUp() liefert NULL, wenn kein parent element vorhanden ist
stimmt natürlich... hab ja gesagt es ist ungetestet, so könnte es gehen
void CExporter::GetHierarchy(BaseDocument* doc) { BaseObject* obj = doc->GetFirstObject(); while( obj != NULL ) { DoParse( obj ); if( obj->GetDown() == NULL ) { while( obj != NULL && obj->GetNext() == NULL ) { obj = obj->GetUp(); } if( obj != NULL ) { obj = obj->GetNext(); } } else { obj = obj->GetDown(); } } }
es schadet allerdings nicht, sich an finix' ratschlag zu halten
-
danke an alle, es funktioniert!