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


Anmelden zum Antworten