Benutzerdefinierte Conversion von Pointern
-
Hallo,
ich habe zwei Klassen Node und Node_Container und möchte einen Conversion-Operator definieren, der mir einen Pointer auf Node in einen Pointer auf Node_Container umwandelt. Ich habe es mit
class Node { Node_Container* node_container(); operator Node_Container() { return *node_container(); } ... };versucht (also einen Conversion-Operator von Node zu Node_Container definiert und angenommen, dass man dann automatisch einen von Node* zu Node_Container* hat).
Wenn ich dann aber
Node_Container n = *target->first_child(); Node_Container* p = target->first_child(); p = target->first_child();versuche zu kompilieren (target->first_child() liefert einen Node*), erhalte ich
cannot convert ‘Node*’ to ‘Node_Container*’ in initialization
cannot convert ‘Node*’ to ‘Node_Container*’ in assignmentbezüglich der zweiten und dritten Zeile, d.h. Umwandlung von Node zu Node_Container funktioniert, aber nicht von Node* zu Node_Container*.
Kann man das irgendwie beheben?
-
Du musst, sofern ich Dein Problem verstanden habe, Deinen Cast-Operator auch für Node_Container* überladen.
-
Wie macht man das denn? Mein Problem dabei ist, dass ich Cast-Operatoren nur als Member-Funktionen kenne. Kann man die auch irgendwie außerhalb von Klassen definieren? Es gibt ja keine Klasse Node*.
-
Du kannst keine Operatoren für Zeiger überladen.
-
Hmm, achso. So wie sich Dein Problem darstellt, braucht es wohl eine Funktion zum Konvertieren.
-
Oh Mann...
Will ihm keiner sagen dass es sehr stark danach aussieht dass er Mist baut?
-
Na gut

ingobulla, der Wunsch nach automatischer Konvertierung von Node in Node_Container riecht stark nach einem Designproblem. Warum brauchst du das?
-
Mein Bedürfnis nach automatischer Pointer-Konvertierung erwächst aus der speziellen Form von Graphen, mit denen ich arbeite (im Wesentlichen geht es darum die Genealogie von HIV unter Berücksichtigung von Rekombination mittels Koaleszenztheorie zu rekonstruieren).
Ich bin mir aber sicher, das es euch nicht zumutbar ist, in reiner Textform die spezielle Form dieser Graphen zu erklären. Von daher: Kann man hier auch irgendwie Graphiken hochladen?
-
Ganz egal was deine Problem-Domäne ist, du musst trotzdem nie einen Konvertierungs-Operator Node -> Node_Container basteln.
Das geht auch einfach mit Accessor Funktionen + Copy-Ctor oder evtl. Clone Funktion (je nachdem was man braucht).Ich würde es nichtmal als Designproblem bezeichnen, sondern für mich ist das einfach ein Wunsch der aus Faulheit + der fehlenden Erfahrung entsteht. Der (fehlenden) Erfahrung nämlich dass sowas den Code so unleserlich und unverständlich macht dass man mit Wartung und Fehlersuche weit mehr Zeit verschenkt als mit dem geringfügig höheren Tippaufwand wenn man es einfach so schreibt wie es "geschrieben gehört".
Nämlich so:
// Node_Container n = *target->first_child(); Node_Container n = *target->first_child()->container(); // Node_Container* p = target->first_child(); // p = target->first_child(); Node_Container* p = target->first_child()->container(); p = target->first_child()->container();p.S.: die Konvertierung "Node -> Container" ist IMO so wie du die Semantik definiert hast (bzw. wie ich vermute dass du sie definiert hast) auch vollkommen unintuitiv. Wenn dann würde ich mir erwarten einen neuen Container zu bekommen der *nur* diese eine Node enthält. Eine Kopie des Containers zu bekommen wo die Node drinnen steckt (mit allem anderen was der Container sonst noch enthält) ist irgendwie nicht das was man sich erwartet. IMO sollte das Ergebnis einer Konvertierung nur von der Quelle abhängen, und nicht davon wo die Quelle eventuell referenziert wird, drin steckt, oder ob gerade Donnerstag ist.