C++ exception Funktionalität nachbilden
-
Hallo miteinander,
gibt es ein Tutorium/Pattern wie ich die Funktionalität der C++ exceptions nachbauen kann?
Ich habe eine Quadtree Klasse in der ich FEM-Elemente unterteile. Da ich bereits von einem Netz ausgehe, hängen mehrere Baume in einer linearen Liste. Wenn ich nun von einem Unterelement einen Nachbarn such kann es vorkommen dass er in einem anderen Quadtree liegt und die Ausrichtungen nicht zueinander passen. Wenn nun die Ausrichtungen nicht zueinander passen möchte ich von der linearen Liste aus eine "Orientierungs"-Objekt zurückgeben dass darauf hinweist.
Die Nachbarschaftssuche wird vom Quadtree aus aufgerufen und sieht die Rückgabe eines solchen Objektes nicht vor.
Nun dachte ich dass es vieleicht besser ist eine art "throw" zu verwenden anstatt den allgemein verwendbaren Baum anzupassen.
Herzlichen Dank für alle Hinweise
Viele Grüße
Martin
-
-
Knecht schrieb:
Hallo miteinander,
gibt es ein Tutorium/Pattern wie ich die Funktionalität der C++ exceptions nachbauen kann?
Ich habe eine Quadtree Klasse in der ich FEM-Elemente unterteile. Da ich bereits von einem Netz ausgehe, hängen mehrere Baume in einer linearen Liste. Wenn ich nun von einem Unterelement einen Nachbarn such kann es vorkommen dass er in einem anderen Quadtree liegt und die Ausrichtungen nicht zueinander passen. Wenn nun die Ausrichtungen nicht zueinander passen möchte ich von der linearen Liste aus eine "Orientierungs"-Objekt zurückgeben dass darauf hinweist.
Die Nachbarschaftssuche wird vom Quadtree aus aufgerufen und sieht die Rückgabe eines solchen Objektes nicht vor.
Nun dachte ich dass es vieleicht besser ist eine art "throw" zu verwenden anstatt den allgemein verwendbaren Baum anzupassen.
Herzlichen Dank für alle Hinweise
Viele Grüße
MartinIch sehe den Zusammenhang zwischen deinem Quadtree und den Exceptions nicht? Und warum musst du diese Funktionalität "nachbilden", wenn es sie doch schon gibt?
finix schrieb:
Das verstehe ich jetzt noch weniger. Ich vermute, du willst dasselbe sagen wie ich.
-
ich glaub' er meint manuelles 'stack unwinding'?
dafür gibt's ja 'longjmp' (aber aus irgeneinem grund sollte man das in c++ nicht verwenden).
-
Hallo miteinander,
sorry wenn ich mich nicht verständlich ausgedrückt habe. Dann probiere ich es halt noch mal.
Den Baum den ich verwende wurde von Mistubishi entwickelt und soll sehr schnell und allgemein anwendbar sein. Die Nachbarschaftssuche von einem "Leave Node" aus liefert "nur" den jeweiligen Nachbarn zurück.
Ich habe aber nicht eine "Element" oder eine "Domain" die ich unterteilen will, sondern mehrere, die aneinander angrenzen, wesshalb ich mehrere separate Bäumen in eine selbst gebastelte Liste hänge.
Die Liste ist selbst gebastelt, da wenn eine Nachbarschaftssuche beim "Root Node" ankommt noch nicht gesagt ist, dass es keinen Nachbarn gibt. Das Listenelement weis das aber und weist die suche an den richtigen Baum weiter.
Das funktioniert soweit auch prima. Jetzt habe ich aber beim weiterarbeiten festgestellt, dass ich auch noch auf die Orientierung der Koordinatensysteme der einzelnen "Elemente" achten muss, da das externe Programm, dass die Elemente liefert nicht dafür sorgt, dass diese gleich orientiert sind.
Der einzige Ort an dem ich dies feststellen kann ist die selbst gebastelte Liste wenn ich an den "Nachbar Baum" verweise. Um diese Information aber nun in der aufrufenden Funktion nutzen zu können, müsste ich also ein neues Objekt in den Baum einführen und durch alle rekursiven aufrufe schleifen. Damit ist der Baum aber auf den spezielle Anwendungsfall spezialisiert.
Nun dachte ich, ich kann dazu statt dessen eine "exception" missbrauchen, da diese Objekte an die aufrufende Klasse zurückliefern kann, wenn dies erforderlich ist.
Dabei gibt es zwei Probleme. Das Hauptproblem ist, dass throw die weitere Ausführung der Nachbarschaftssuche sofort abbricht und ich dann in der aufrufenden Funktion im catch-Teil nur das "geworfene" Orientierungs-Objekt bekomme nicht aber den dazu gehörigen nachbarn.
Der Zweite Punkt ist, dass exceptions für die Fehlerbehandlung gedacht sind, und glaube ich nicht für eine derartige Verwendung missbraucht werden sollten.
Deshalb die Frage wie sich das Verhalten der exceptions nachbauen lässt oder wie es sich alternativ lösen ließe?
Herzlichen Dank für alle Ansätze
Viele Grüße
Knecht
-
net schrieb:
ich glaub' er meint manuelles 'stack unwinding'?
dafür gibt's ja 'longjmp' (aber aus irgeneinem grund sollte man das in c++ nicht verwenden).Stroustrup selbst geht in der "C++ Programmiersprache" darauf ein, dass 'throw' prinzipiell durchaus für das Durchreichen von Rückgabewerten verwendet werden kann. Er rät, soweit ich das in Erinnerung habe, deswegen davon ab, weil es konzeptionell einer "Ausnahme" widerspricht, nicht aber aus technischen Gründen.
=>
- Es ist möglich (legal).
- Es ist evtl. nicht moralisch.
-
net schrieb:
ich glaub' er meint manuelles 'stack unwinding'?
dafür gibt's ja 'longjmp' (aber aus irgeneinem grund sollte man das in c++ nicht verwenden).longjmp räumt glaube ich in C++ nicht auf (sprich destruiert keine C++-Objekte).