matrix double multiplikation als operator
-
Hallo,
ich wollte:
Matrix A; ... // befüllen ... Matrix B = -1.0*A;Welchen Operator muss ich überladen damit ich das -1.0 links von meiner Klasse schreiben kann?
-
Wenn du multiplizieren willst, natürlich den operator* - hier in Form einer freien Funktion:
Matrix operator* (double faktor, const Matrix& m);
-
Wenn du sie nur negieren willst, kannst du den unären Vorzeichenoperator implementieren.
@CStoll Rückgabe nicht
const?
-
CStoll schrieb:
Wenn du multiplizieren willst, natürlich den operator* - hier in Form einer freien Funktion:
Matrix operator* (double faktor, const Matrix& m);Danke für die schnelle Antwort aber ich bekomme bei
matrix &operator*(double factor, const matrix &rhs) const;folgende Fehlermeldung
error C2804: binary 'operator *' has too many parametersmit VS 2010
-
Du hast sie als Methode implementiert. Wie CStoll gesagt hat sollst du sie frei implementieren.
-
EOutOfResources schrieb:
@CStoll Rückgabe nicht
const?Wenn du unbedingt darauf bestehst, kann man das natürlich machen

@sumsum1: Übrigens ist es eine schlechte Idee, aus einem arithmetischen Operator eine Referenz zurückzugeben.
-
Danke für die Hinweise an alle.
CStoll schrieb:
@sumsum1: Übrigens ist es eine schlechte Idee, aus einem arithmetischen Operator eine Referenz zurückzugeben.
Könntest du mir bitte ein Beispiel nennen warum es nicht gut ist? Immerhin geht es hier ja um eventuell unnötiges kopieren.
-
Kurze Antwort: Eine Referenz kannst du nur dann zurückgeben, wenn das referenzierte Objekt lange genug überlebt. Und dein Operator wird vermutlich ein lokales Objekt zurückgeben - und das überlebt nicht lange genug um etwas damit machen zu können.
(tja, mitunter sind Kopien unvermeidlich)
-
matrix &operator*(double factor, const matrix &rhs) const{ matrix ergebnis;//lokale variable for(...{ for(...{ ergebnis[j][i]=rhs[j][i]*factor; return ergebnis;//referenz auf lokale varieble rausgeben }//lokale variable stirbt hier! die referenz zeigt auf toten speicherKommst nicht um die Kopie rum. Also im Prinzip nicht.
Aber faktisch doch!!!Matrix c=5*a;//hier zaubert ein schklauer compiler normalerweise und schreibt das ergebnis gleich nach c reinhttp://en.wikipedia.org/wiki/Return_value_optimization und NRVO
-
CStoll schrieb:
EOutOfResources schrieb:
@CStoll Rückgabe nicht
const?Wenn du unbedingt darauf bestehst, kann man das natürlich machen

Würde ich nicht. Bringt nicht wirklich Vorteile.
-
CStoll schrieb:
(tja, mitunter sind Kopien unvermeidlich)
Außer man heißt uBLAS oder Blitz++

-
otze schrieb:
CStoll schrieb:
(tja, mitunter sind Kopien unvermeidlich)
Außer man heißt uBLAS oder Blitz++

Zumindest uBLAS hat eine unbrachbare Syntax, wofür das u wohl auch steht.
-
Nexus schrieb:
Würde ich nicht. Bringt nicht wirklich Vorteile.
Es kann Fehler verhindern.
-
EOutOfResources schrieb:
Nexus schrieb:
Würde ich nicht. Bringt nicht wirklich Vorteile.
Es kann Fehler verhindern.
Beispiel?
Mir fällt gerade (vermutlich wegen Gurkenmangels) nur Mist ein wiec=(a+b)*=2;//gäbe mit const einen compilerfehler
-
volkard schrieb:
Beispiel?
//Rückgabe nicht const: if(a * b = c) { //Hoppla, ich wollte vergleichen aber es kompiliert } //Rückgabe const: if(a * b = c) { //Hoppla, ich wollte vergleichen aber Compilefehler }Scott Meyers vertritt die selbe Meinung in "Effektiv C++".
-
EOutOfResources schrieb:
//Rückgabe nicht const: if(a * b = c) { //Hoppla, ich wollte vergleichen aber es kompiliert }Hier spuckt dir jeder vernünftige Compiler bei einer vernünftigen Warnungsstufe eine Warnung aus, dass du eine Zuweisung in der Bedingung stehen hast. Und als vernünftiger Entwickler siehst du natürlich zu, dass dein Code warnungsfrei compiliert und behebst das auch ohne const Rückgabe.
-
Zur Erheiterung: Dieser Fehler fliegt, wenn ich matrix keinen operator bool schenke bei if(a*b=c):
C:\src\research\tmpcpp\main.cpp||In function 'int main()':| C:\src\research\tmpcpp\main.cpp|7|error: could not convert '((operator*((a, matrix()), (b, matrix())), ((const matrix&)((const matrix*)(& c)))), operator*((a, matrix()), (b, matrix())))' to 'bool'| ||=== Build finished: 1 errors, 0 warnings ===|Im Prinzip hast Du wohl recht.
Ich würde auch vorschlagen, darüber nachzudenken, noch weiter zu gehen, und den Zuweisungsoperator void zurückgeben zu lassen. Dann hat sich das const in diesem Beispiel von selbst erledigt.
-
volkard schrieb:
EOutOfResources schrieb:
Nexus schrieb:
Würde ich nicht. Bringt nicht wirklich Vorteile.
Es kann Fehler verhindern.
Beispiel?
Mir fällt gerade (vermutlich wegen Gurkenmangels) nur Mist ein wiec=(a+b)*=2;//gäbe mit const einen compilerfehlerc=a+b;Ist schon das perfekte Beispiel warum const Mist ist. Ohne const kann eine move-Zuweisung benutzt werden. Mit const müssen wir kopieren.