2017-09-02 10 views
1

仕様は、行列の要素にアクセスして割り当てるために括弧()演算子をオーバーロードすることですが、私のオーバーロード関数が返す必要があるものを把握するのは苦労しています。 Overloaded()operator

ブリーフメイン:

//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* 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'への参照を返そうとするとき、クライアントコードが何らかの理由で要素アドレスを利用することが有効であると考える場合は、時には便利です)。 –