Operator Überladung



  • N`abend.

    Ich habe nen kleines Problem mit Operator Überladung.
    Es gibt eone Klasse MATRIX, in der ein Doppelpointer **mat, sowie zwei int Werte für Zeilen und Spalten der Matrix existieren.
    Aber guckt selbst:

    #ifndef MATH_OP_H
    #define MATH_OP_H
    
    #include <iostream.h>
    #include <iomanip.h>
    #include <stdlib.h>
    
    class MATRIX
    {
      private:  
        double  **mat;
        int     zeilen;
        int     spalten;
    
      public:
        MATRIX();
        MATRIX(int,int);
        MATRIX(const MATRIX &);
        ~MATRIX();
    
        void Eingabe();
        void Ausgabe();
    
        MATRIX operator*(const MATRIX &);
        MATRIX operator=(const MATRIX &);
    };
    
    #endif
    

    In der Implementierung steht folgede operator* Methode:

    MATRIX MATRIX::operator*(const MATRIX &mat2)
    {
      MATRIX temp;
      int i,j,k,sum = 0;
    
      for(i = 0; i < zeilen; i++)
      {
        for(j = 0; j < mat2.spalten; j++)
        {
          for(k = 0; k < spalten; k++)
          {
            sum = sum + (mat[i][j] * mat2[j][k]) ;
            temp[i][k] = sum;
          }
        }
      }
    }
    

    Wie man vielleicht erkennen kann, möchte ich die Matrizzen multiplizieren.
    Aber ich bekomme diesen Fehler:
    math_op\math_impl.cpp(146) : error C2676: Binaerer Operator '[' : 'const class MATRIX' definiert diesen Operator oder eine Konvertierung in einen fuer den vordefi

    Ich möchte ja auch nicht '[' überladen ,sonder '*'.
    Ich hab das Gefühl das die Methode seinen Doppelpointer gar net kennt.

    Kann mir vielleicht jemand nen Tipp geben ?

    Danke
    SLi



  • temp und mat2 sind vom Typ MATRIX und nicht double**. Wenn du auf den Member mat wie auf ein Array zugreifen willst, mußt du für Matrix auch den operator[] definieren.



  • Hmmm,

    ok danke soweit.
    Nur kann ich mir nicht vorstellen wie das geht, und das das verlangt wäre.
    Die vorgaben für die Klasse waren ziemlich genau und dort standen nur diese beiden Operatorüberladungen.
    Ist meine Denkweise beim multiplizieren vielleicht falsch?
    Muss man da anders ran gehen?

    greetz
    SLi



  • temp.mat statt temp in der Schleife (und natürlich für alle anderen Matrizen)



  • Schön,

    jetzt ist es nur noch ein Fehler 😉
    Aber leider genau in dieser Zeile:

    sum = sum + mat[i][j] * mat2[j][k] ;
    

    Das muss doch irgendwie auch ohne operator[] gehen, oder?

    Wär nett, wenn nochmal jemand antworten könnte 🙂

    greetz
    SLi



  • sliwalker schrieb:

    Schön,

    jetzt ist es nur noch ein Fehler 😉
    Aber leider genau in dieser Zeile:

    sum = sum + mat[i][j] * mat2[j][k] ;
    

    Das muss doch irgendwie auch ohne operator[] gehen, oder?

    ➡ nochmal mein Posting lesen:)



  • @interpreter: Hab mal wieder den Wald vor Bäumen nicht gesehen. 😃

    @sliwalker: Nee, daraus kannste doch auch ein

    sum = sum + mat[i][j] * mat2.mat[j][k];
    

    machen. 😉



  • du musst einfach den operator[] überladen. Der wird nicht automatisch generiert. Eine Klasse liefert ja nicht automatisch so etwas mit, nur weil es ein Array Member hat 🙄

    Übrigens ist doch Matritze*Matritze mathematisch normalerweise gar nicht definiert.



  • kingruedi schrieb:

    du musst einfach den operator[] überladen.

    Nö. Einfach auf mat zugreifen und fertig.

    Übrigens ist doch Matritze*Matritze mathematisch normalerweise gar nicht definiert.

    Naja, er müsste halt noch prüfen, ob bei A*B, wobei A eine m x n Matrix und B eine k x l Matrix ist, n = k ist.



  • sum = sum + mat[i][j] * mat2[j][k] ;
            temp.mat[i][k] = sum;
    

    Icvh finde jetzt nur logisch, in der unteren Zeile deinen Vorschlag anzunehmen.
    Weil temp ja wie der Name sagt temporär ist und nur die Ergebnisse zwischenspeichern soll.
    temp soll nicht selbst Teil vom Produkt sein.

    Ich gehe momentan davon aus, das mat meine eingegebene Matrix A enthält und mat2 durch den Kopierkonstruktor erstellt wurde und ebenfalls eingegebene Werte enthält.

    hier mal was aus main:

    #include "math_op.h"
    
    int main()
    {
      int z_A,s_A,z_B,s_B;
    
      cout << "Matrix-Multiplikation\n" << endl;
    
      do
      {
        cout << "Anzahl Zeilen von Matrix A: ";
        cin  >> z_A;
      } while(z_A < 1);
    
       do
      {
        cout << "Anzahl Spalten von Matrix A: ";
        cin  >> s_A;
      } while(s_A < 1);
    
      z_B = s_A;        // damit C = A * B UND
      s_B = z_A;        //       D = B * A möglich ist!
    
      MATRIX A(z_A,s_A);
      MATRIX B(z_B,s_B);
      MATRIX C(z_A,s_B);
      MATRIX D(z_B,s_A);
    
      cout << "\nWerte fuer Matrix A eingeben: " << endl << endl;
      A.Eingabe();
    
      cout << "\nWerte fuer Matrix B eingeben: " << endl << endl;
      B.Eingabe();
    
      cout << "Matrix A" << endl << endl;
      A.Ausgabe();
    
      cout << "Matrix B" << endl << endl;
      B.Ausgabe();
    
      cout << "Die Multiplikation A * B ergibt Matrix C" << endl << endl;
      C = A * B;
      C.Ausgabe();
    
      cout << "Die Multiplikation B * A ergibt Matrix D" << endl << endl;
      D = B * A;
      D.Ausgabe();
    
      return(0);
    }
    

    Mich nervt das schon seit heute NAchmittag und ich würde es gerne morgen fertig haben. Ist jetzt aber auch nicht lebenswichtig 😉
    Ich kapier es nicht 😢

    greetz
    SLi



  • @interpreter:

    Dein Vorschlag funktioniert.
    Jetzt läuft es wenigstens.
    Gibt zwar nen Laufzeitfehler, aber damit kann ich schon mal was anfangen.
    Danke euch allen 😉

    Hier nochmal komplett:

    MATRIX MATRIX::operator*(const MATRIX &mat2)
    {
      MATRIX temp;
      int i,j,k;
      double sum = 0;
    
      for(i = 0; i < zeilen; i++)
      {
        for(j = 0; j < mat2.spalten; j++)
        {
          for(k = 0; k < spalten; k++)
          {
            sum = sum + mat[i][j] * mat2.mat[j][k]; 
            temp.mat[i][k] = sum;
          }
        }
      }
      return(temp);
    }
    

    greetz und thx
    SLi


Anmelden zum Antworten