no match for 'operator=' in 'BruderVonPeter = Peter.matrix::getTransposed'
-
Hallo zusammen,
ich bastel gerade an nem (Anfänger-) Programm und bräuchte eure Hilfe.
Könnt ihr mir helfen?Fehler ist,wie oben beschrieben:
no match for 'operator=' in 'BruderVonPeter = Peter.matrix::getTransposed'
candidates are: matrix& matrix::operator=(const matrix&)Wäre super!
Edit: Entry ist nen Vector per #include <vector> ,Klasse hat private Variablen,numOfRows,numOfColumns.
Edit2:Der Übersichtlichkeit wegen Code gelöscht,da der unten identisch ist!Fehler war matrix matrix&:: anstatt matrix& matrix:: !Machts gut,
Noah
-
Du müsstest schon die Funktionsaufruf-Klammern schreiben.

BruderVonPeter=Peter.getTransposed();
-
Ups!
Dann hats geklappt,danke
So,aber irgendwie klappen nun andere Dinge nicht!Und zwar:
int main() {matrix Peter(3,2); Peter.set(0,0,9); Peter.set(0,1,2); Peter.set(1,0,3); Peter.set(1,1,4); Peter.set(2,0,5); Peter.set(2,1,6); cout<<"Hallo"<<"\n"; Peter.dump(); cout<<"\n"; matrix Jochen=Peter.getTransposed(); // 1: Hier erste Fehler,gibt nen Abbruch.Die zugeh. Funktion ist * Jochen.dump(); //bzw. hier,keine Ahnung,was von den beiden dann nen Fehler gibt. cout<<"\n"; matrix BruderVonPeter(3,2); BruderVonPeter=Peter; // 2 :Hier das zweite Problem,wo nicht alles zugewiesen wird! BruderVonPeter.dump(); cin.get(); }Das ist wieder die testmatrix.cpp und dann noch
matrix :: matrix (const int &numOfRows, const int &numOfColumns ) { this->numOfRows=numOfRows; this->numOfColumns=numOfColumns; entry.resize(numOfRows); for (int i=0; i<entry.size(); i++) { entry[i].resize(numOfColumns); } }; matrix :: matrix (const matrix& q) { this->numOfRows=q.numOfRows; this->numOfColumns=q.numOfColumns; for(int i=0;i<this->numOfColumns;i++) { for(int j=0;j<this->numOfRows;j++) { this->entry[i][j]=q.entry[i][j]; } } }; matrix matrix :: getTransposed() const // 1 { matrix transposed (this->numOfColumns,this->numOfRows); for(int i=0;i<this->numOfColumns;i++) { for(int j=0;j<this->numOfRows;j++) { transposed.entry[i][j]=this->entry[j][i]; } } return transposed; } ; void matrix :: dump() const {for (int i=0;i<this->numOfRows;i++) { cout<<"\n"; for(int j=0;j<this->numOfColumns;j++) {cout<<this->get(i,j); cout<<"\t"; }; } }; matrix& matrix::operator = ( const matrix &rhsMatrix ) // 2: Operator,der Sorgen macht { if (this->numOfRows==rhsMatrix.numOfRows && this->numOfColumns==rhsMatrix.numOfColumns) { for(int i=0;i<this->numOfColumns;i++) { for(int j=0;j<this->numOfRows;j++) { this->entry[i][j]=rhsMatrix.entry[i][j]; //Hatte das im Programm geändert,hilft leider nichts :( } } return *this; } else {cerr<<"Die Matrizen passen nicht zueinander!"; } }; matrix matrix::operator + ( const matrix &rhsMatrix ) const { matrix addition(this->numOfRows,this->numOfColumns); for(int q=0;q<this->numOfColumns;q++) { for(int s=0;s<this->numOfRows;s++) { addition.entry[q][s]=this->entry[q][s]+rhsMatrix.entry[q][s]; } } return addition; }; matrix& matrix::operator += ( const matrix &rhsMatrix ) {for(int i=0;i<this->numOfColumns;i++) { for(int j=0;j<this->numOfRows;j++) { this->entry[i][j]=+rhsMatrix.entry[i][j]; } } return *this; }; matrix matrix::operator * ( const matrix &rhsMatrix ) const { matrix multi(this->numOfRows,rhsMatrix.numOfColumns); for(int q=0;q<this->numOfColumns;q++) { for(int s=0;s<this->numOfRows;s++) { multi.entry[q][s]=this->entry[q][s]*rhsMatrix.entry[q][s]; } }; return multi; }Das Problem ist folgendes:Kompilieren klappt,dann bricht das Programm aber ab und gibt dieses Problem festgestellt an und muss beendet werden.Das hat was mit .getTransposed * zu tun,wenn ich das wegkommentiere,passt das.
Dann ist das zweite Problem,dass ich bei ** mit dem Zuweisungsoperator nur die erste Zeile zuweise,der Rest Null bleibt!Wenn ich das mit dem Standard-Copy mache,dann geht das komplett!Woran könnte das liegen?Machts gut,
Noah!
-
Könntest du bitte das nächste mal anstatt ** Zahlen, oder Buchstaben nehmen? Zuerst dachte ich, dass es sich da um irgenwas mit Dereferenzierung handelt.
- Die Sternchen haben sehr viele Bedeutung in C++. 
matrix& matrix::operator = ( const matrix &rhsMatrix ) // ** Operator,der Sorgen macht { if (this->numOfRows==rhsMatrix.numOfRows && this->numOfColumns==rhsMatrix.numOfColumns) { for(int i=0;i<this->numOfColumns;i++) { for(int j=0;j<this->numOfRows;j++) { this->entry[i][j]=this->entry[i][j]; // <--------- hier } } return *this; } else {cerr<<"Die Matrizen passen nicht zueinander!"; } };Also hier drin ist sicher schon mal etwas falsch..
Dann würde ich hier auch eher eine Funktion schreiben, die für dich das kopieren übernimmt, ansonsten musst du den Code an mehreren Stellen ändern, wenn du was ändern willst. ( Oder am besten mit den Standardfunktionen, wie std::for_each usw. arbeiten )
-
Alles klar,mach ich! 1*,2*...

Oh,ja,das hatte ich bei mir geändert,aber anscheinend nicht in dem Beitrag gemacht.Da müsste natürlich
this->entry[i][j]=rhsMatrix.entry[i][j];stehen...
Aber wieso funktioniert das im CopyKonstruktor(Zeile 16 ff) ,aber nicht in z.B. getTransposed (29 ff)?Im Grunde müsste das doch gehen...
Und es funktioniert leider immer noch nicht :(!
Was meinst du denn mit den Standard Funktionen,bzw,wo schaut man die nach?
-
Standardzeugs gibts hier:
http://www.cplusplus.com/reference/speziell für dich habe ich diese Sektion gedacht: (sehr nützlich ;))
http://www.cplusplus.com/reference/algorithm/Ich weiss nicht genau, was da nicht geht, aber geh da doch einfach mal mit dem Debugger durch, dann siehst du ja, wo etwas passiert, dass du nicht willst.

-
Noah schrieb:
Aber wieso funktioniert das im CopyKonstruktor(Zeile 16 ff) ,aber nicht in z.B. getTransposed (29 ff)?Im Grunde müsste das doch gehen...
Und es funktioniert leider immer noch nicht :(!
Was meinst du denn mit den Standard Funktionen,bzw,wo schaut man die nach?Bist noch nicht mit dem Debugger durchgegangen, oder?
Deine innere for-Schleife ist falsch - dadurch, dass du dort auch noch mal alle Elemente durchgehst, hast du nicht nur alles richtig getauscht sondern danach auch wieder alles zurückgetauscht...bb
-
Den Debugger mag ich nicht
Bin den von VBA gewohnt... 
Ehm,jo,du hattest Recht,hab bei den Schleifen Zeile und Spalte vertauscht gehabt (Copy Paste von getTransposed) und den return zu früh(Hatte das irgendwie schon geändert,aber irgendwie hatte der das nicht geändert).
Was ich allerdings immer noch nicht verstehe,warum der beim Kompilieren nichts sagt,aber dann abbricht bei 2!(Der Operator klappt nun :D)matrix Jochen=Peter.getTransposed(); Jochen.dump();und
matrix :: matrix (const int &numOfRows, const int &numOfColumns ) { this->numOfRows=numOfRows; this->numOfColumns=numOfColumns; entry.resize(numOfRows); for (int i=0; i<entry.size(); i++) { entry[i].resize(numOfColumns); } }; matrix :: matrix (const matrix& q) { this->numOfRows=q.numOfRows; this->numOfColumns=q.numOfColumns; entry.resize(numOfRows); for (int i=0; i<entry.size(); i++) { entry[i].resize(numOfColumns); } for(int i=0;i<this->numOfRows;i++) { for(int j=0;j<this->numOfColumns;j++) { this->entry[i][j]=q.entry[i][j]; } } };Wobei mir der aber jetzt noch nen anderen Fehler ausgibt,nämlich:
definition of implicitly-declared `matrix::matrix(const matrix&)'Und falls ich dann den Copy Konstruktor weglasse,würds ja in die Hose gehen wegen Abbruch.
Und falls ich Copy weglasse UND vorher Jochen als neue Matrix ala matrix Jochen(2,3) definiere,meckert der wg. erneuter Deklaration.Wieso gibts keinen Wein Smilie?
Machs gut,
Noah
-
Wie wärs also damit:
void matrix::init () { //gegebenenfalls noch ne prüfung der werte gegen 0 weil das ja nu ne sooo viel Sinn macht ^^ entry.reserve(numOfRows); for(int i (0); i != numOfRows; ++i) { RowType X; for(int j (0); j != numOfColumns; ++j) { X.push_back(0); } entry.push_back(X); } } matrix::matrix (int numOfRows, int numOfColumns) : numOfRows(numOfRows), numOfColumns(numOfColumns) { init(); }sieht das nicht etwas besser aus?
void matrix::swap (const matrix &rhs) { for(int i (0); i != numOfColumns; ++i) { for(int j (0); j != numOfRows; ++j) { entry[i][j] = rhs.entry[j][i]; } } } matrix::matrix (const matrix &rhs) : numOfRows(rhs.numOfRows), numOfColumns(rhs.numOfColumns) { init(); swap(rhs); }so siehts ja evtl auch scho etwas übersichtlicher aus
matrix matrix::getTransposed () const { matrix R(numOfColumns, numOfRows); for(int i (0); i != numOfColumns; ++i) { for(int j (0); j != numOfRows; ++j) { R.entry[i][j] = entry[j][i]; } } return R; }und so sollte es wenigstens richtig sein
bb
PS: Kanns sein, dass das Forum in letzter Zeit irgendwie ständig rumspackt? oO
-
Ja,das stimmt...manchmal komme ich nicht drauf...
Hmm...es geht immer noch nicht mit getTransposed

Naja,is egal.Dann transponier ich halt nicht.Braucht eh keiner.
Danke euch
