Multiplikation eines Objekts mit einer Konstanten von der linken Seite

8

Ich habe eine Klasse Matrix und sie hat * Operatoren für Skalar- und Matrixmultiplikationen überladen.

%Vor%

Ich kann ein Matrixobjekt mit einem Skalar von der rechten Seite ohne irgendein Problem multiplizieren:

%Vor%

Aber wie multipliziere ich es von der linken Seite auf die gleiche Weise?

%Vor%

In der Arithmetik ist es eine übliche Notation, Konstanten auf der linken Seite zu schreiben, wenn man Multiplikationen vornimmt. Ich möchte diese Regel befolgen, um meinen Code lesbarer zu machen.

Ist es möglich, dies in C ++ zu implementieren? Wenn es möglich ist, wie ändere ich die Klassenmethode in meinem Code?

    
hkBattousai 23.01.2013, 14:45
quelle

2 Antworten

9

Elementfunktionen werden durch ihr Argument auf der linken Seite abgeglichen, das der This-Zeiger ist. Da native Typen keine Memberfunktionen haben können, müssen Sie die Rechtmultiplikation mit benutzerdefinierten Typen durch Nichtmitgliedsfunktionen hinzufügen (und auch für andere Typen, auf die Sie keinen Schreibzugriff haben).

%Vor%

HINWEIS : Ich habe das obige Nichtmitglied operator* in Bezug auf ein Mitglied operator*= implementiert. Es wird empfohlen, alle Multiplikationen als Nichtmitgliedsfunktionen zu schreiben und ein Mitglied operator*= zu verwenden, um diese Multiplikationen mit einem lhs-Matrixelement zu implementieren.

Dies wird a) die Klassenschnittstelle minimal halten und b) versteckte Konvertierungen verhindern. Z.B. Sie könnten eine Matrix-Klasse haben, die implizit in Skalar konvertierbar ist, wenn die Dimensionen 1x1 sind, und diese Konvertierungen können automatisch auftreten, wenn Sie keine separate Überladung bereitstellen, die eine direkte Übereinstimmung darstellt.

%Vor%

Beachten Sie, dass die LHS-Matrix eine Kopie und keine Referenz ist. Dadurch kann der Compiler Optimierungen vornehmen, wie zum Beispiel die Eliminierung von Kopien und die Semantik von Bewegungen. Beachten Sie auch, dass der Rückgabetyp dieser Operatoren Matrix<T> und nicht const Matrix<T> ist, was in einigen alten C ++ - Büchern empfohlen wurde, aber die Verschiebungssemantik in C ++ 11 verhindert.

%Vor%     
TemplateRex 23.01.2013, 14:48
quelle
8

Sie benötigen dafür eine Nichtmitgliedsfunktion:

%Vor%

Nicht-Member-Operator-Überladungen ermöglichen Ihnen, einen beliebigen Typ auf jeder Seite anzugeben, während Member-Überladungen immer das Objekt auf der linken Seite erhalten.

    
Mike Seymour 23.01.2013 14:47
quelle