我有几个问题。我创建了一个包含操作符重载的类:
double MMatrix::operator()(int i, int j)const
{
return A[j + i * nCols];
}
为了有效地将该类的实例传递给函数,我过去常常创建该类的指针作为函数的形式参数。我想在指向函数内类对象的指针中使用这个重载操作符:
void Set_Matrix(MMatrix* M)
{
size_t m = M->NRows();
size_t n = M->NCols();
for (unsigned int i = 0; i < m; i++)
M(i, i) = 2; //This line gives error
}
函数的最后一行给出了一个错误消息:E0109表达式前面的括号显然调用必须有(指针指向-)函数类型如果你给我这个问题的解决方案,我将不胜感激。
问题是M
是指向MMatrix
的指针,因此您首先必须对该指针解引用以获得MMatrix
类型的底层对象,然后使用重载的operator()
,如下所示:
void Set_Matrix(MMatrix* M)
{
size_t m = M->NRows();
size_t n = M->NCols();
for (unsigned int i = 0; i < m; i++)
//------vvvv----------------->dereference M first before using operator()
(*M)(i, i) = 2;
}
另一种选择是使参数的类型为MMatrix&
,如下所示:
//---------------------v---->lvalue reference
void Set_Matrix(MMatrix& M)
{
size_t m = M.NRows();
size_t n = M.NCols();
for (unsigned int i = 0; i < m; i++)
//------v----------------->no need of dereferencing
M(i, i) = 2;
}
还需要注意的是,opeartor()
的返回类型是double
而不是double&
,由于我们不能赋值给内建类型右值,上述解决方案将产生相同的错误。为了解决这个问题,您可以将返回类型设置为double&
,这将允许我们执行赋值操作。
作为引用传递,语法更清晰
void Set_Matrix(MMatrix& M)
{
size_t m = M.NRows();
size_t n = M.NCols();
for (unsigned int i = 0; i < m; i++)
M(i, i) = 2; <<==
}
您需要的其他信息
void Set_Matrix(MMatrix* M)
{
size_t m = M->NRows();
size_t n = M->NCols();
for (unsigned int i = 0; i < m; i++)
(*M)(i, i) = 2; <<==
}