读书人

C++quot;+quot;运算符重载有关问题

发布时间: 2012-06-12 14:21:25 作者: rapoo

C++"+"运算符重载问题

C/C++ code
#include <iostream>using namespace std;const int M=3;const int N=4;class matrixadd{private:int a[M][N];public:    matrixadd()    {    for(int i=0;i<M;i++)    for(int j=0;j<N;j++)        a[i][j]=0;    }    matrixadd( int x[M][N])    {for(int i=0;i<M;i++)    for(int j=0;j<N;j++)        a[i][j]=x[i][j];    }matrixadd operator+(matrixadd b);    matrixadd operator=(matrixadd &b)    {                for(int i=0;i<M;i++)            for(int j=0;j<N;j++)                a[i][j]=b.a[i][j];            return *this;    }    void show()    {int k=0;        for(int i=0;i<M;i++)            for(int j=0;j<N;j++)            {    cout<<a[i][j]<<" ";            k=k+1;            if(k%N==0)                cout<<endl;            }    }};matrixadd matrixadd:: operator+(matrixadd b){matrixadd d;        for(int i=0;i<M;i++)        {            for(int j=0;j<N;j++)            {d.a[i][j]=a[i][j]+b.a[i][j];            }        }        return d;    }void main(){int k1=0;int x1[M][N],x2[M][N];cout<<"请输入第一个矩阵:"<<endl;for(int i=0;i<M;i++)for(int j=0;j<N;j++){    cin>>x1[i][j];}cout<<"请输入第二个矩阵:"<<endl;for(int i1=0;i1<M;i1++)for(int j1=0;j1<N;j1++){    cin>>x2[i1][j1];}matrixadd ma1(int x1[M][N]), ma2(int x2[M][N]), ma3;ma3=ma1+ma2;ma3.show();}



本代码功能是两个三行四列的矩阵的相加,运用‘+’运算符相加,调试后一直提示:
error C2296: '+' : illegal, left operand has type 'class matrixadd (__cdecl *)(int [][4])'


求大神指点迷津,实在想不出错误

[解决办法]
这行:matrixadd ma1(int x1[M][N]), ma2(int x2[M][N]), ma3;
改成:matrixadd ma1(x1), ma2(x2), ma3;
[解决办法]
++ 正解
探讨
这行:matrixadd ma1(int x1[M][N]), ma2(int x2[M][N]), ma3;
改成:matrixadd ma1(x1), ma2(x2), ma3;

[解决办法]
建议用友元函数重载+或-,理由:
1. 这样可以保持原操作数(矩阵)不发生改变
2. 如果操作符有前后关系时,比如-号,a - b和b - a是不一样的,用有缘函数重载这类操作符,使用起来更灵活一些

参考实现代码:
C/C++ code
#include <iostream>using namespace std;class Matrix{private:    double* data;    int row;    int column;public:    Matrix(int row, int column)    {        this->row = row;        this->column = column;        data = new double[row * column];    }    Matrix(const Matrix& matrix)    {        row = matrix.row;        column = matrix.column;        data = new double[row * column];        for(int i = 0; i < row; ++i)        {            for(int j = 0; j < column; ++j)            {                *(data + i * column + j) = *(matrix.data + i * column + j);            }        }            }    double* get_data()    {        return data;    }    int get_row()    {        return row;    }    int get_column()    {        return column;    }    friend Matrix* operator+(const Matrix& matrix1, const Matrix& matrix2)    {        if((matrix1.row != matrix2.row) || (matrix1.column != matrix2.column))        {            cout << "Fails to add two matrices with different row or column." << endl;        }        Matrix* matrix = new Matrix(matrix1.row, matrix1.column);        for(int i = 0; i < matrix1.row; ++i)        {            for(int j = 0; j < matrix1.column; ++j)            {                *(matrix->data + i * matrix1.column + j) = *(matrix1.data + i * matrix1.column + j) + *(matrix2.data + i * matrix1.column + j);            }        }        return matrix;    }    friend Matrix* operator-(const Matrix& matrix1, const Matrix& matrix2)    {        if((matrix1.row != matrix2.row) || (matrix1.column != matrix2.column))        {            cout << "Fails to minus a matrix with different row or column." << endl;        }        Matrix* matrix = new Matrix(matrix1.row, matrix1.column);        for(int i = 0; i < matrix1.row; ++i)        {            for(int j = 0; j < matrix1.column; ++j)            {                *(matrix->data + i * matrix1.column + j) = *(matrix1.data + i * matrix1.column + j) - *(matrix2.data + i * matrix1.column + j);            }        }        return matrix;    }    void display()    {        for(int i = 0; i < row; ++i)        {            for(int j = 0; j < column; ++j)            {                cout << *(data + i * column + j) << "\t";            }            cout << endl;        }    }    ~Matrix()    {        delete[] data;    }};int main(int argc, char** argv){    // 初始化矩阵a    Matrix a(2, 2);    for(int i = 0; i < 2; ++i)    {        for(int j = 0; j < 2; ++j)        {            *(a.get_data() + i * 2 + j) = 1 + i * 2 + j;        }    }    // 显示矩阵a    a.display();    cout << "============" << endl;    // 初始化矩阵b    Matrix b(2, 2);    for(int i = 0; i < 2; ++i)    {        for(int j = 0; j < 2; ++j)        {            *(b.get_data() + i * 2 + j) = 2 + i * 2 + j;        }    }    // 显示矩阵b    b.display();    cout << "============" << endl;    // 两矩阵相加    Matrix* c = a + b;    c->display();    cout << "============" << endl;    delete c;    // 两矩阵相减    Matrix* d = b - a;    d->display();    cout << "============" << endl;    delete d;    return 0;} 


[解决办法]
operator重载真是常见的各种不规范
1 不需要友元 除非你需要+的左边是其它类型 但是建议给operator+加const保证不修改
2 参数应该为const引用
3 赋值的参数也同样
4 赋值应当返回引用而不是实例

读书人网 >C++

热点推荐