重载()运算符

时间:2017-09-02 06:18:30

标签: c++ operator-overloading parentheses lvalue

规范是重载括号()运算符来访问和分配矩阵的元素,但是,我正在努力弄清楚我的重载函数需要返回什么。

The Brief Main:

//The .h files and everything has been included, my other functions work just not this one
cout << "Test (): " << endl;
m0(0,0) = 17.25;
m0(1,5) = -2.33;
m0(5,5) = 233;   // There is class exception handling I just haven't included it

功能实施:

Matrix* Matrix::operator () (const unsigned int m, const unsigned int n) //We were told they HAD to be unsigned int
{
    Matrix *ptr = &matrix[m][n];
     return ptr;
}

错误:

main.cpp: In function ‘int main()’:
main.cpp:59:15: error: lvalue required as left operand of assignment
     m0(0,0) = 17.25;
               ^~~~~
main.cpp:60:16: error: lvalue required as left operand of assignment
     m0(1,5) = -2.33;
                ^~~~
main.cpp:61:15: error: lvalue required as left operand of assignment
     m0(5,5) = 233; // should throw an exception

我理解错误在说什么,所以请不要只是告诉我再读一遍并修复它。我实际上并不确定如何修复我的函数返回的内容并使其成为主函数中的double值实际上可以分配给某些东西。

提前致谢

1 个答案:

答案 0 :(得分:3)

如果你在程序中检查这一行:

m0(0,0) = 17.25;

您正在尝试为()运算符返回的值指定double值。

这意味着你应该返回允许分配一个double值的东西 - 而最简单的方法就是返回一个double。

另外,因为你想为它分配一些内容,你应该返回一个引用 - 否则,你只需返回一个简单的临时值,并且不允许赋值。即使编译器允许它,你也不会看到矩阵中的变化,因为你会改变一个临时值。

我也看到在你当前的实现中,你正在返回一个指针。指针类似于引用,但是如果你考虑它,你不能直接为指针所指向的内存赋值 - 你必须首先取消引用它:

double* d = ...; // points to some memory
*d = 5;

这就是为什么在这种情况下参考更好。