2010-11-04 111 views
0

我试图重载ostream的< <运营商在我的矩阵类,但我不断收到以下错误:C++重载运算符<<在Matrix类

预计构造函数,析构函数或类型之前令牌&

转换
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; 
} 
+0

从输入流中读取时,需要确保处理可能发生的任何错误(例如,如果输入数据与您期望的格式不匹配)。这是通过在每次输入操作之后测试流的状态来完成的。你的C++书应该详细说明这是如何工作的。考虑使用某种形式的智能指针或像std :: vector这样的标准库容器来存储矩阵类使用的存储空间。正如所写,您的班级不是例外安全的,很可能您的手动内存管理存在错误。 – 2010-11-04 02:48:41

回答

3

如果你想重载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对象。

0

其余只要改变

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

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

这将是一个独立的功能..和应该只是罚款。

2

把它写成:

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

修正了这个问题,但现在我得到了: – Tony 2010-11-04 02:44:50

+0

错误:将'const Matrix'作为'int'参数'int Matrix :: getNumrows()'丢弃限定符| – Tony 2010-11-04 02:46:11

+1

@Tony:如果你想在一个const限定的对象上调用成员函数,你需要对成员函数进行const限定。 – 2010-11-04 02:49:35