重载 ( ) 运算符
Posted
技术标签:
【中文标题】重载 ( ) 运算符【英文标题】:Overloaded ( ) operator 【发布时间】:2017-09-02 06:18:30 【问题描述】:规范是重载括号 () 运算符以访问和分配矩阵的元素,但是,我正在努力弄清楚我的重载函数需要返回什么。
简介:
//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
我明白错误在说什么,所以请不要只是告诉我再读一遍并修复它。我实际上并不确定如何修复我的函数返回的内容并使其实现,以便实际上可以将 main 中的双精度值分配给某些东西。
提前致谢
【问题讨论】:
您必须返回对元素的引用而不是指向整个对象的指针才能分配给它 【参考方案1】:如果您在程序中检查这一行:
m0(0,0) = 17.25;
您正在尝试为 () 运算符返回的值分配一个双精度值。
这意味着您应该返回允许为其分配双精度值的东西 - 最简单的方法是返回双精度值。
另外,因为你想给它赋值,你应该返回一个引用——否则,你只会返回一个简单的临时值,并且不允许赋值。即使编译器允许,您也不会看到矩阵中的更改,因为您会更改临时值。
我还看到,在您当前的实现中,您正在返回一个指针。指针类似于引用,但如果你仔细想想,你不能直接给指针指向的内存赋值——你必须先取消引用:
double* d = ...; // points to some memory
*d = 5;
这就是为什么在这种情况下引用更好。
【讨论】:
好答案。 FWIW,当你有一个const Matrix
对象并且只想读取一个元素(或者可能const double& Matrix::operator() (unsigned m, unsigned n) const
返回对double
在矩阵中,如果您认为客户端代码出于某种原因使用元素地址有效,则偶尔有用)。以上是关于重载 ( ) 运算符的主要内容,如果未能解决你的问题,请参考以下文章