Operator + überladen ?
-
Hallo Leute
Möchte eine Klasse Matrix definieren, die einen Konstruktor enthält der über eine Integer intialisiert wird und dann je nach dem welche Zahl nach der Deklaration in () steht unterschiedliche Anweisungen ablaufen lassen.
Hier mein Code :
class matrix { std::valarray<double> matrix1; int anzahl,zeilen,spalten; public: matrix(); matrix(int a) : matrix1(anzahl) { zeilen = StrToInt(addition->zeilenE->Text); spalten = StrToInt(addition->spaltenE->Text); anzahl = zeilen * spalten; if (a=1) { int m = 0; for(int i = 0;i < zeilen ;i++) for(int j = 0;j < spalten;j++) { m++; matrix1[m]=StrToFloat(addition->matrix1S->Cells[i][j]); }; } else if (a=2) { int m = 0; for(int i = 0;i < zeilen ;i++) for(int j = 0;j < spalten;j++) { m++; matrix1[m]=StrToFloat(addition->matrix2S->Cells[i][j]); }; }; };
Hier dann die Umsetzung:
matrix1 m(1); // StringGrid1 soll in valarray eingelesen werden.
matrix1 n(2); // StringGrid2 soll in valarray eingelesen werden.So wie ich es jetzt habe ließt er immer das erste StringGrid ein.
matrix1 m(2); // So steht es bei mir im Hauptprogramm m.ausgabe();
-
ersetze a=1 und a=2 durch a==1 bzw. a==2.
-
Hi
Ohhh Mann Schande über mich !!!
Wie kann ich dann einen Operator + überladen so dass ich m(1) und n(2)
so addieren kann :m(1)+n(2) ?
Hier mein Versuch :
class matrix { std::valarray<double> v; int anzahl,zeilen,spalten; public: matrix(); matrix(int a) : v(anzahl) { zeilen = StrToInt(addition->zeilenE->Text); spalten = StrToInt(addition->spaltenE->Text); anzahl = zeilen * spalten; if (a==1) { int m = 0; for(int i = 0;i < zeilen ;i++) for(int j = 0;j < spalten;j++) { m++; v[m]=StrToFloat(addition->matrix1S->Cells[i][j]); }; } else if (a==2) { int m = 0; for(int i = 0;i < zeilen ;i++) for(int j = 0;j < spalten;j++) { m++; v[m]=StrToFloat(addition->matrix2S->Cells[i][j]); }; }; }; std::valarray<double> getMatrix() { return v; }; std::valarray<double> operator + (matrix m) { std::valarray<double> h; h = m + m.getMatrix(); return h; }; };
Hier die Fehlermeldung :
[C++ Fehler] matrix.h(51): E2094 'operator+' ist im Typ 'matrix' für Argumente des Typs '_STL::valarray<double>' nicht implementiert
THX Fleedo
-
Vielleicht ungefähr so:
const matrix operator+(const matrix& mat1, const matrix& mat2) { //Schleife durchlaufen und Elemente addieren... }
-
Hallo Fubar
Die Schleife kann man sich sparen da ja eine Matrix Variable ein Valarray ist.
Diese kann man dann einfach folgendermaßen addieren :std::valarray<double> m(8) // Vektor mit 9 Elementen std::valarray<double> n(8) // Vektor mit 9 Elementen m + n // d.h m(0) + n(0), m(1) + n(1) ...
Mein Problem ist, wie addiere ich die Variablen Matrix miteinander, da sie durch verschiedene Indizes verschiedene Wert, und zwar die der unterschiedlichen StringGrids aufnehmen.
Hier die Fehlermeldungen : [C++ Fehler] matrix.h(53): E2080 'matrix::operator +(matrix &,matrix &)' muß mit einem Parameter deklariert werden [C++ Fehler] matrix.h(55): E2093 'operator+' ist im Typ 'matrix' für Argumente desselben Typs nicht implementiert Bitte helft mir Leute matrix m(1); //StringGrid 1 wird in valarray v eingelesen matrix n(2); //StringGrid 2 wird in valarray v eingelesen n + m; //Die Werte mit den selben Positionen in den StrinGrids sollen addiert werden
Hierzu muß ich den Operator überladen, dass habe ich folgendermaßen probiert:
matrix operator + (matrix& m,matrix& n) { matrix e(3); e = m + n; return e; }; };
Hier nochmal der komplette Quellcode:
class matrix { std::valarray<double> v; int anzahl,zeilen,spalten; public: matrix(); matrix(int a) : v(anzahl) { zeilen = StrToInt(addition->zeilenE->Text); spalten = StrToInt(addition->spaltenE->Text); anzahl = zeilen * spalten; if (a==1) { int m = 0; for(int i = 0;i < zeilen ;i++) for(int j = 0;j < spalten;j++) { m++; v[m]=StrToFloat(addition->matrix1S->Cells[i][j]); }; } else if (a==2) { int m = 0; for(int i = 0;i < zeilen ;i++) for(int j = 0;j < spalten;j++) { m++; v[m]=StrToFloat(addition->matrix2S->Cells[i][j]); }; } else if (a==3) { int m = 0; for(int i = 0;i < zeilen ;i++) for(int j = 0;j < spalten;j++) { m++; addition->matrixES->Cells[i][j] = v[m]; }; }; }; matrix operator + (matrix& m,matrix& n) { matrix e(3); e = m + n; return e; }; };
-
Wenn du den operator+ so überladen willst, mußt du ihn außerhalb der Klasse deklarieren
class matrix { ... //evtl. friend matrix operator + (matrix& m,matrix& n); //oder halt get-Methoden oder Index-Operator überladen... } matrix operator + (matrix& m,matrix& n) { ... }
oder ganz anders
class matrix { ... matrix operator+ (const matrix& mat); } matrix matrix::operator+(const matrix& mat) { ... }
-
class matrix { ... //evtl. friend matrix operator + (matrix& m,matrix& n); //oder halt get-Methoden oder Index-Operator überladen... } const matrix operator + (const matrix& m, const matrix& n) { ... }
gefällt mir persönlich besser
-
Hi Leute
Habs so probiert, geht allerdings nicht, könnt ihr mir nochmal helfen ?
class matrix { public: std::valarray<double> u,v; int anzahl,zeilen,spalten; matrix(); matrix(int a) : v(anzahl),u(anzahl) { zeilen = StrToInt(addition->zeilenE->Text); spalten = StrToInt(addition->spaltenE->Text); anzahl = zeilen * spalten; if (a==1) { int m = 0; for(int i = 0;i < zeilen ;i++) for(int j = 0;j < spalten;j++) { m++; v[m]=StrToFloat(addition->matrix1S->Cells[i][j]); }; } else if (a==2) { int m = 0; for(int i = 0;i < zeilen ;i++) for(int j = 0;j < spalten;j++) { m++; u[m]=StrToFloat(addition->matrix2S->Cells[i][j]); }; }; }; friend std::valarray<double> operator + (matrix& m,matrix& n); }; std::valarray<double> ergebnis; std::valarray<double> operator + (matrix& m,matrix& n) { ergebnis = m.u + n.v; return ergebnis; };
den valarray ergebnis würde ich dann gerne in ein weiters StringGrid ausgeben.
THX Fleedo