是否可以创建一个指针指向一个类的对象,其中包含重载操作符?



我有几个问题。我创建了一个包含操作符重载的类:

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; <<==
}

相关内容

最新更新