2017-09-02 84 views
1

規範是重載括號()運算符來訪問和分配矩陣的元素,但是,我正在努力弄清楚我的重載函數需要返回什麼。Overloaded()運算符

的簡要主:

//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

你必須返回一個元素的引用,而不是指向整個對象的指針才能分配給它 –

回答

3

如果選中該行程序:

m0(0,0) = 17.25; 

您試圖分配一個double值由()運算符返回的值。

這意味着您應該返回允許分配給它的double值的東西 - 而最簡單的方法是返回double。另外,因爲你想分配一些東西給它,你應該返回一個引用 - 否則,你只會返回一個簡單的臨時值,並且不允許賦值。即使編譯器允許它,也不會在矩陣中看到更改,因爲您將更改臨時值。

我也看到,在你當前的實現中,你正在返回一個指針。指針類似於引用,但是如果你仔細想想,你不能直接分配一個值由指針指向的內存 - 你必須取消對它的引用第一:

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

,這就是爲什麼一提的是更好在這種情況下。

+0

好的答案。 FWIW,提供'double&Matrix :: operator()(unsigned m,unsigned n)' - 支持賦值 - 和'double Matrix :: operator()(unsigned m,unsigned n)const'是正常的。當你有一個'const Matrix'對象並且只想讀取一個元素(或者可能是'const double&Matrix :: operator()(unsigned m,unsigned n)const'來返回對矩陣內的double的引用時,如果您認爲客戶端代碼由於某種原因使用元素地址是有效的,則偶爾會有用)。 –