2016-05-05 8 views
1

整数配列を保持するクラスArrayを作成しました。 main関数では、mainで宣言された配列の場合と同様に[]を使ってArrayの配列の要素を取得しようとしています。私は次のコードのように演算子[]をオーバーロードしました。私は主から、これら二つの機能を呼び出すしようとする最初の機能は、左辺値と第二の右辺値(コンストラクタおよび他のメンバ関数が図示されていない。)しかしlvalueとrvalueのC++演算子のオーバーロード

#include <iostream> 
using namespace std; 

class Array { 
public: 
    int& operator[] (const int index) 
    { 
     return a[index]; 
    } 
    int operator[] (const int index) const 
    { 
     return a[index]; 
    } 

private: 
    int* a; 
} 

を返し、最初の機能があってもアクセスされます変数は左辺値として使用されません。 lvalue関数を使用するだけですべてが処理できれば、rvalueのための別の関数を作成することはできません。

次のコードは、私が使用した主な機能である(オペレータ< <が適切にオーバーロードされている。):

#include "array.h" 
#include <iostream> 
using namespace std; 

int main() { 
    Array array; 
    array[3] = 5;    // lvalue function called 
    cout << array[3] << endl; // lvalue function called 
    array[4] = array[3]   // lvalue function called for both 
} 

は、私は右辺値関数を呼び出すことができる方法はありますか?左辺と右辺の両方の関数を定義する必要もありますか?

+0

おそらく、演算子は 'Array'ではなく' int& 'と' const int& 'を返すと宣言されるべきです。 –

+0

はい、そうです。私の悪い – HelperKing

答えて

6

第二の機能はconst member functionであり、あなたがconstインスタンスがある場合に呼び出されます。

const Array array; 
cout << array[3] << endl; // rvalue function called 

をこれらの「左辺値」と「右辺値」関数を呼び出すために、従来ではありません。また、必要に応じてconstリファレンスを返すようにconstを定義することもできます。

+0

const関数が呼び出されますが、この例では結果を割り当てることができませんでした。 – doug

関連する問題