重载operator =不用编译进行编译

时间:2015-03-06 21:04:34

标签: c++ c++11 matrix

github repo with code 试图通过重载某些操作来编写Matrix类 当我尝试使用此笔划进行编译时,一切都会出错

result = (l_mtx + r_mtx);

我从g ++中得到错误:
g ++ -g3 -std = c ++ 11 -Wall -o matrix matrix_class.h matrix.cpp

matrix.cpp:在函数'int main()'中:
matrix.cpp:36:12:错误:没有匹配函数来调用'Matrix :: Matrix(Matrix)'

result = (l_mtx + r_mtx);   

然后去了几个这个功能的候选人,我真的不明白 我认为复制构造函数和几个构造函数,但这不是operator =我认为应该在那个笔划中进行校准。

matrix_class.h:73:5:注意:Matrix :: Matrix(Matrix&)[with type = double]
(没有已知的从'Matrix'到'Matrix&'的参数1的转换 )

matrix_class.h:46:5:注意:Matrix :: Matrix(int,int)[with type = double]
 (候选人需要2个参数,1个提供)

matrix_class.h:39:5:注意:Matrix :: Matrix()[with type = double]
(候选人需要0个参数,1个提供)

然后是错误:
matrix_class.h:96:18:错误:初始化'Matrix Matrix :: operator =(Matrix)[with type = double]'的参数1

我认为我没有正确的代码赋值运算符或复制构造函数,但我找不到错误的位置。抱歉愚蠢的问题。感谢您的关注。

//copy constructor
    Matrix(const Matrix<type> &org)
    {
        cout << "Making a copy of " << this << endl;
        row = org.getRow();
        column = org.getColumn();

        //allocate additional space for a copy
        data = new type* [row];
        for (int i = 0; i < row; ++i)
        {
            data[i] = new type [column];
        }

        for (int i = 0; i < row; ++i)
        {
            for (int j = 0; j < column; ++j)
            {
                data[i][j] = org.data[i][j];
            }
        }
    }

和operator =

//assign constructor
Matrix<type> operator = (Matrix<type> r_mtx)
{
    if (row == r_mtx.getRow())
    {
        if (column == r_mtx.getColumn())
        {
            //TODO: удалить прежний объект?
            Matrix<type> temp(row, column);
            for (int i = 0; i < row; ++i)
            {
                for (int j = 0; j < column; ++j)
                {
                    temp.data[i][j] = r_mtx[i][j];
                }
            }
            return temp;
        }
        else
        {
            cout << "Assign error: matrix column are not equal!" << endl;
            exit(EXIT_FAILURE);
        }
    }
    else
    {
        cout << "Assign error: matrix rows are not equal!" << endl;
        exit(EXIT_FAILURE);
    }
}

2 个答案:

答案 0 :(得分:1)

声明像

这样的复制赋值运算符
Matrix<type> & operator = ( const Matrix<type> &r_mtx )

问题是临时对象可能没有绑定到非const引用。

考虑到赋值运算符应该返回对左手对象的引用。

您的赋值运算符实际上无效。它不是分配左手对象而是创建一个临时对象。所以没有任何分配。

可以定义类似这样的

Matrix<type> & operator = ( const Matrix<type> &r_mtx )
{
    if (row == r_mtx.getRow())
    {
        if (column == r_mtx.getColumn())
        {
            for (int i = 0; i < row; ++i)
            {
                for (int j = 0; j < column; ++j)
                {
                    data[i][j] = r_mtx[i][j];
                }
            }
            return *this;
        }
        else
        {
            cout << "Assign error: matrix column are not equal!" << endl;
            exit(EXIT_FAILURE);
        }
    }
    else
    {
        cout << "Assign error: matrix rows are not equal!" << endl;
        exit(EXIT_FAILURE);
    }
}

答案 1 :(得分:0)

以下是使用copy and swap idiom的变体的简单建议:

Matrix<type> & operator = ( Matrix<type> r_mtx )  //  pass by value
{
    if ( getRow() != r_mtx.getRow() || getColumn() != r_mtx.getColumn() )
        throw std::runtime_error("Wrong dimension in matrix assigment");

    std::swap(data, r_mtx.data);
    return *this;
}

如果您想允许分配即使目标矩阵不是正确的尺寸,那么您可以取出尺寸检查,复制或交换rowcolumn(以及任何其他成员变量)。

使用throw优于exit,因为它为您的代码用户提供了更多选项。如果他们不是catch那么它相当于退出。