C ++ оператор перегрузки << в классе Matrix - PullRequest
0 голосов
/ 04 ноября 2010

Я пытаюсь перегрузить оператор ostream << в своем классе Matrix, но получаю следующую ошибку: </p>

Ожидаемый конструктор, деструктор или преобразование типов перед токеном &

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

Это остальная часть моего класса

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

Ответы [ 3 ]

3 голосов
/ 04 ноября 2010

Если вы хотите перегрузить ostream operator<< для вашего класса, вам нужно использовать функцию друга или функцию, не являющуюся членом, потому что объект ostream появляется в левой части выражения (оно написанокак os << my_matrix).

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

Это выглядит как будто вы пытаетесь реализовать его как функцию-член, но на самом деле это должно выглядеть так:

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

Это не будет работать, потому что при реализации перегрузки оператора в качестве функции-члена тип объекта в левой части выражения совпадает с типом класса, членом которого является перегрузка (поэтомув этом случае вам придется написать my_matrix1 << my_matrix2, что вам не нужно).

Внутри перегрузки вы не должны писать в cout напрямую;Вы должны записать объект ostream, который передается в качестве аргумента функции.

2 голосов
/ 04 ноября 2010

Напишите как:

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

и это будет работать. Он не должен быть функцией-членом Matrix.

0 голосов
/ 04 ноября 2010

Просто изменить

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

до

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

Это будет автономная функция .. и должна работать нормально.

...