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);
}
}
答案 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;
}
如果您想允许分配即使目标矩阵不是正确的尺寸,那么您可以取出尺寸检查,复制或交换row
和column
(以及任何其他成员变量)。
使用throw
优于exit
,因为它为您的代码用户提供了更多选项。如果他们不是catch
那么它相当于退出。