C ++ с использованием перегрузки оператора - PullRequest
0 голосов
/ 09 ноября 2018
#include <iostream>


using namespace std;


class   matrix   

{

private:

    int row;

    int col;

    int **data;

public:

    matrix(int r=0,int c=0)

    {
        row=r;
        col=c;
        data=new int*[row];
        for(int i=0; i<row; i++)
        {
            data[i]=new int [col];
        }
    }

    friend void createMatrix (int row, int col, int num[], matrix& mat);

    friend istream &operator>>(istream&in,matrix &mat);

    friend ostream &operator<<(ostream&out,matrix &mat);

    matrix operator+ (matrix mat)
    {
        matrix z(row,col);
        if((row==mat.row)&&(col==mat.col))
        {
            for(int i=0 ; i<row ; i++)
            {
                for(int j=0 ; j<col; j++)
                {
                    z.data[i][j]=data[i][j]+mat.data[i][j];
                }
            }
        }
        else
        {
            cout<<"Matrix that aren't the same size can't be added"<<endl;
        }
        return z;
    }        

};                   

 ostream &operator<<(ostream&out,matrix &mat)        

{

    for(int i=0; i<mat.row; i++)
    {
        for(int j=0; j<mat.col; j++)
        {
            out<<mat.data[i][j]<<" ";
        }
        out<<endl;
    }
    return out;
}

istream &operator >>(istream &in,matrix& mat)

{

    cout<<"Enter the size of your matrix"<<endl;
    in>>mat.row;
    in>>mat.col;
    mat.data=new int*[mat.row];
    cout<<"Enter the elements of your matrix"<<endl;
    for(int x=0; x<mat.row; x++)
    {
        mat.data[x]=new int[mat.col];
    }
    for(int i=0; i<mat.row; i++)
    {
        for(int j=0 ; j<mat.col; j++)
        {
            in>>mat.data[i][j];
        }
    }
    return in;
}

int main()

{

    matrix x,y;

    cin>>x>>y;
    cout<<x+y<<endl;
    return 0;
}

void createMatrix (int row, int col, int num[], matrix& mat)

{

    mat.row = row;
    mat.col = col;
    mat.data = new int* [row];

    for (int i = 0; i < row; i++)
        mat.data[i] = new int [col];

    for (int i = 0; i < row; i++)
        for (int j = 0; j < col; j++)
            mat.data[i][j] = num[i * col + j];
}

Когда я пытаюсь запустить, я получаю сообщение об ошибке:

|83|error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'matrix')|

но когда я меняю основной на:

matrix x,y,z;
cin>>x>>y;
z=x+y;
cout<<z<<endl;
return 0;

У меня нет проблем, хотя я не могу использовать это, потому что мне приходится делать около 14 различных перегрузок операторов. Я не уверен, что это ошибка кода или ошибка компилятора. Любая идея, что я могу сделать, чтобы решить это?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вы определили свой operator<< для получения ссылки на матрицу

ostream &operator<<(ostream&out,matrix &mat)

при выводе выражения

x+y

- это временный объект, который нельзя передать как ссылку. Вы должны либо передать его как постоянную ссылку const matrix& mat, либо по значению matrix mat. В этом случае вам следует использовать константную ссылку, чтобы избежать копирования всей матрицы.

0 голосов
/ 09 ноября 2018

Использовать постоянную матрицу:

ostream &operator<<(ostream&out,const matrix &mat)

Это создает временную матрицу

cout<<x+y<<endl;

Он не может быть передан только по ссылке. И так как это для вывода, это должно быть const ref в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...