Problem beim Überladen des & Operators
-
Hallo erstmal,
ich soll für die Uni ein Klasse schreiben, mit der man Matrizen verarbeiten kann. Die Klasse funktioniert soweit, auch, wenn sie vom Design vielleicht nicht wirklich "schön" ist. Nun soll ich für diese Klasse den & Operator (Bitweise AND) global so überladen, dass der Inhalt der beiden Objekte vertauscht wird.
Nun fangen aber meine Probleme an. Hier mal ein Beispielcode, wie das ganze funktionieren soll
class QuadMatrix{...} ... ... QuadMatrix matrix1, matrix2; matrix1.insert(); //Die erste Matrix mit Inhalt füllen matrix2.insert(); //Die zweite Matrix mit Inhalt füllen matrix1 & matrix2; //Hiernach hat matrix1 den Inhalt von matrix2 und umgekehrtBei der Umsetzung stoße ich (natürlich?) an das Problem, dass die Operatorfunktion einen Rückgabewert verlangt. Vielleicht habe ich da noch ein Verständnisproblem, aber so, wie der Operator gedacht ist, soll er ja nur die beiden Operanden vertauschen, nicht aber, wie z.B. bei arithmetischen Operatoren, ein neues Ergebnis liefern. Hat vielleicht jemand eine Idee, wie ich an das Problem richtig heran gehe?
-
Berufspenner schrieb:
...aber so, wie der Operator gedacht ist, soll er ja nur die beiden Operanden vertauschen, nicht aber, wie z.B. bei arithmetischen Operatoren, ein neues Ergebnis liefern.
Genau deshalb solltest du den Operator dafür auch nicht missbrauchen. Was spricht gegen ein einfaches matrix1.Swap( matrix2 ), oder ::Swap( matrix1, matrix2 )?
-
rückgabewert wegmachen mit void.
void operator&(QuadMatrix& a,QuadMatrix &b) { //tausch tausch tausch }
-
Solange du das nur selber benötigst, geht es noch knapp. Wenn das Matrix-Framework aber auch anderen Programmierern zur Verfügung gestellt werden soll, kann das für Verwirrung sorgen.
Die Idee hinter Operatorüberladung ist einfache Handhabung, und dazu gehört auch, dass die Semantik selbsterklärend ist. Wenn man für eine Operation keinen Operator hat, der gut passt, wie zum Beispiel zum Tausch, ist eine Funktion viel sinnvoller. Wenn man "Swap" sieht, ist einem auf den ersten Blick klar, was die Funktion macht. Bei
operator&kann man auch leicht auf die Idee kommen, dass z.B. elementweise UND angewendet wird. An einen Tausch denkt man dabei sicher als Letztes.
-
David_pb schrieb:
Berufspenner schrieb:
...aber so, wie der Operator gedacht ist, soll er ja nur die beiden Operanden vertauschen, nicht aber, wie z.B. bei arithmetischen Operatoren, ein neues Ergebnis liefern.
Genau deshalb solltest du den Operator dafür auch nicht missbrauchen. Was spricht gegen ein einfaches matrix1.Swap( matrix2 ), oder ::Swap( matrix1, matrix2 )?
Ganz einfach: die Aufgabenstellung

volkard schrieb:
rückgabewert wegmachen mit void.
void operator&(QuadMatrix& a,QuadMatrix &b) { //tausch tausch tausch }Ok, dann war es wirklich mangelndes Verständnis, weil ich dachte, dass die Operatorfunktion zwingend vom Typ der Klasse sein muss. Jetzt läuft alles bestens. Danke dafür
