Probleme beim überladen von Operatoren
-
Ich versuche momentan eine Klasse Matrix zu schreiben. Ich habe mich dabei nicht für eine feste Spalten/Zeilenanzahl entscheiden, sondern lege die Daten dynamisch an. Das funktioniert problemlos und auch Operatoren wie z.B. += gehen. Wenn ich aber operator+ überladen will kommt es zu Fehlern.
class Matrix { private: float *Daten; int Zeilen, Spalten; float firstItem; public: //... konstruktoren, destruktor andere operatoren etc. lasse ich hier weg. Matrix operator + (Matrix &Mat); void operator = (const Matrix &Mat); void operator += (Matrix &Mat); void SetDimension(int i, int j); //neue Zeilen & Spalten anzahl, Matrix wird auch auf null gesetzt. int Get(int x, int y) const; void Set(int x, int y, float Val); }; Matrix Matrix::operator+(Matrix &Mat) { Matrix temp(Zeilen,Spalten); for (int i=0; i<Spalten; i++) { for (int j=0; j<Zeilen; j++) { temp.Set(i,j,Get(i,j)+Mat.Get(i,j)); } } //Wenn ich hier die Matrix ausgebe ist alles korrekt return temp; } void Matrix::operator=(const Matrix &Mat) { if (&Mat==this) return; //Wenn ich hier die Matrix ausgebe, stimmen die Werte nicht mehr, ein teil sind bloss noch nullen SetDimension(Mat.Spalten,Mat.Zeilen); for(int i=0; i<Spalten; i++) { for (int j=0; j<Zeilen; j++) { Set(i,j,Mat.Get(i,j)); } } } void Matrix::SetDimension(int i, int j) { if (i==Spalten&&j==Zeilen) { ZeroMemory(Daten, sizeof(float)*i*j); return; } if (Daten) delete [] Daten; Daten=new float[i*j]; ZeroMemory(Daten, sizeof(float)*i*j); Spalten=i; Zeilen=j; }
Wenn ich die Matrix (temp) am Schluss von operator+ ausgebe stimmen die Werte. Wenn ich sie am Anfang von operator= ausgebe, sind plötzlich ein Teil der Werte nur noch nullen. Weiss jemand woran das liegen könnte?
-
IMHO sollte operator+ folgende Signatur haben:
const Matrix operator+(const Matrix& lhs, const Matrix& rhs)
Dann könntest du ihn z.B. so implementieren
const Matrix operator+(const Matrix& lhs, const Matrix& rhs) { Matrix ret(lhs); //Copy-Ctor ret += rhs; return ret; //oder in Kurzform: return Matrix(lhs) += rhs; }
Und warum benutzt du bei Klassenfunktionen Get & Set, wo du doch Zugriff auf (die) Daten hast?
Bei operator+-* usw. solltest du testen, ob die Dimensionen auch passen!
Poste mal den Copy-Ctor, vielleicht liegt da das Problem.
Habe den Code jetzt nicht ganz durchgesehen, aber das ist mir so aufegfallen ...
-
Vielen Dank. Habe nicht daran gedacht, dass der Copykonstruktor ausgeführt wird. Da war auch der Fehler, jetzt läuft es.
Das mit den Dimensionen werde ich natürlich überprüfen, aber ich wollte zuerst den Fehler beheben.