Question

Je suis en train de surcharger le ostream << opérateur dans ma classe Matrix, mais je continue à obtenir l'erreur suivante:

constructeur attendu, destructor ou conversion de type avant jeton &

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;
}

Ceci est le reste de ma classe

#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;
}
Était-ce utile?

La solution

Si vous voulez surcharger le operator<< ostream pour votre classe, vous devez utiliser une fonction ami ou une fonction non-membre, car l'objet ostream apparaît sur le côté gauche de l'expression (il est écrit os << my_matrix).

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

regarde comme vous essayez de le mettre en œuvre en fonction de membre, mais cela ne devrait effectivement ressembler à:

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

Cela ne fonctionnera pas parce que lorsque vous implémentez une surcharge de l'opérateur en fonction de membre, le type de l'objet sur le côté gauche de l'expression est le même que le type de la classe dont la surcharge est un élément ( donc, dans ce cas, vous auriez à my_matrix1 << my_matrix2 d'écriture, ce qui est pas ce que vous voulez).

À l'intérieur de la surcharge, vous ne devriez pas écrire cout directement; vous devez écrire à l'objet ostream qui est passé comme argument à la fonction.

Autres conseils

Ecrire comme:

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; 
} 

et il fonctionnera. Il ne doit pas être fonction de membre de Matrix.

Il suffit de changer

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

à

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

Ce sera une fonction autonome .. et devrait fonctionner très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top