Frage

Ich versuche, die Ostream << Operator in meiner Matrix-Klasse zu überlasten, aber ich erhalte die folgende Fehlermeldung erhalten:

Erwartete Konstruktor destructor oder Typumwandlung vor Token &

Matrix::ostream& operator<<(const Matrix& matrix)
{
  for (int r = 0; r < matrix.getNumrows(); r++)
  {
    cout << matrix.getPoint(r, 0);
    for (int c = 0; c < matrix.getNumcolumns(); c++)
    {
      cout << " " << matrix.getPoint(r,c);
    }
    cout << endl;
  }

  return stream;
}

Das ist der Rest meiner Klasse

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include "Matrix.h"

using namespace std;

Matrix::Matrix()
{

}

Matrix::Matrix(int rows, int cols) {
    numRows=rows;
    numCols=cols;

    //col=new double[cols];
    mx=new double*[rows];
    for ( int i=0; i < rows; i++ ) {
        mx[i] = new double[cols];
        // initalize each element of the new row.
        for ( int c=0; c < cols; c++ ) {
            mx[i][c] = 0.0;
        }
    }
}


Matrix::Matrix(const Matrix &theMatrix) {
    int rows=theMatrix.numRows;
    int cols=theMatrix.numCols;

    numRows = rows;
    numCols = cols;

    mx=new double*[rows];
    for ( int r=0; r < rows; r++ ) {
        mx[r] = new double[cols];
        // copy each element of the new row.
        for ( int c=0; c < cols; c++ ) {
            mx[r][c] = theMatrix.mx[r][c];

        }
    }
}


void Matrix::setMatrix(string file)
{
    /* read the file */
    fstream inputStream(file.c_str());

    if(inputStream.is_open() )
    {
        string line;
        stringstream ss;

        getline(inputStream, line);
        ss.clear();
        ss.str(line);

        ss >> numRows >> numCols;

        mx=new double*[numRows];
        for ( int i=0; i < numRows; i++ ) {
            mx[i] = new double[numCols];
            // initalize each element of the new row.
            for ( int c=0; c < numCols; c++ ) {
                mx[i][c] = 0.0;
            }
        }


        //now loop to get values
        for(int row=0; row<numRows; row++)
        {
            getline(inputStream, line);
            ss.clear();
            ss.str(line);

            //now get every value in the line
            for(int col=0; col<numCols; col++)
            {
                double current;
                ss >> current;
                mx[row][col] = current;



            }//end reading values of row

        }//end reading rows

    }

    //close the file
    inputStream.close();
}

int Matrix::getNumrows()
{
    return numRows;
}

int Matrix::getNumcolumns()
{
    return numCols;
}

void Matrix::printPoint()
{
    for ( int r=0; r < numRows; r++ )
    {
        for ( int c=0; c < numCols; c++ )
        {
            cout << mx[r][c] << " ";
        }
        cout << endl;
    }
    cout << endl;

}

bool Matrix::getIsSquared()
{
    if( numRows == numCols )
    {
        return true;
    }
    else
    {
        return false;
    }
}

 double Matrix::det()
 {
    double det=0.0;
    if(numRows!=numCols)
    {
        cout << "Number Rows must be same as number Colums\n";
    }

    if(numRows==2)
    {
        det=(mx[0][0]*mx[1][1])-(mx[0][1]*mx[1][0]);
    }
    else
    {
        for(int i=0 ; i<numCols ; i++)
        {
            Matrix temp(numRows-1,numCols-1);
            for(int j=0 ; j<numRows-1 ; j++)
            {
                for(int k=0 ; k<numCols-1 ; k++)
                {
                    if(k<i)
                        temp.mx[j][k]=mx[j+1][k];
                    else
                        temp.mx[j][k]=mx[j+1][k+1];
                }
            }
            det+=pow(-1.0,i)*mx[0][i]*temp.det();
        }
    }
    return det;
 }

 double Matrix::getPoint(int row, int col)
 {
     return mx[row][col];
 }

Matrix Matrix::operator +(const Matrix &right) const
{
    Matrix result(numRows,numCols);
    if ( right.numRows != numRows || right.numCols != numCols )
    {
        cout << "\nError while adding matricies, the two must have the same dimentions.\n";
    }
    else
    {
        for ( int r=0; r < numRows; r++ )
        {
            for ( int c=0; c < numCols; c++ )
            {
                result.mx[r][c] = (this->mx[r][c]) + (right.mx[r][c]);
            }
        }
    }

    return result;
}
War es hilfreich?

Lösung

Wenn Sie die Ostream operator<< für Ihre Klasse zu überlasten möchten, müssen Sie entweder einen Freund Funktion oder eine Nicht-Elementfunktion, weil das ostream Objekt erscheint auf der linken Seite des Ausdrucks (es ist geschrieben als os << my_matrix) verwenden.

std::ostream& operator<<(std::ostream& os, const Matrix& matrix) { /* ... */ }

Es Aussehen wie Sie versuchen, es als Mitglied-Funktion zu implementieren, aber das sollte eigentlich aussehen:

std::ostream& Matrix::operator<<(const Matrix& matrix) { /* ... */ }

Das wird nicht funktionieren, weil, wenn Sie einen Operator Überlastung als Funktionselement implementieren, die Art des Objekts auf der linken Seite des Ausdrucks der gleiche wie der Typ der Klasse ist, von denen die Überlastung Mitglied ist ( so, in diesem Fall, Sie schreiben my_matrix1 << my_matrix2 haben würde, das ist nicht das, was Sie wollen).

Innerhalb der Überlastung, sollten Sie nicht direkt an cout schreiben; Sie sollten das ostream Objekt schreiben, das als Argument an die Funktion übergeben wird.

Andere Tipps

Schreiben Sie es als:

ostream& operator<<(ostream& os, const Matrix& matrix) 
{ 
    for (int r = 0; r < matrix.getNumrows(); r++) 
    { 
        os << matrix.getPoint(r, 0); 
        for (int c = 0; c < matrix.getNumcolumns(); c++) 
        { 
            os << " " << matrix.getPoint(r,c); 
        } 
        os << endl; 
    } 
    return os; 
} 

und es wird funktionieren. Es ist kein Mitglied Funktion der Matrix sein müssen.

Just Änderung

Matrix::ostream& operator<<(const Matrix& matrix)

std::ostream& operator<< (std::ostream &stream, const Matrix &matrix)

Es wird ein Stand-alone-Funktion sein .. und sollte gut funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top