2016-04-04 12 views
0

私は、オーバーロードされた操作を使用することを学んでいるC++の初心者です。私はこのコードを持っている私のメインプログラムでは:私のヘッダーでエラー:読み取り専用ロケーションの割り当て 'arr2.IntArray :: operator [](1)' arr2 [1] = 24;

IntArray arr2(3) 
arr2[1] = 24; 

を、私はこのコード私の.cppファイルで

class IntArray { 
    char *elt; 
    int size 
public: 
    const int& operator[] (int i); 

を持って、私はこのコンストラクタを持っている:

/* one-integer constructor */ 
IntArray::IntArray(int sz) { 
    elt = new char[sz]; 
    for (int i = 0; i<sz; i++) 
    elt[i] = 0; 
    size = sz; 
} 

と、このインデックス演算子

/* Index operator */ 
const int& IntArray::operator[] (int i) { 
    if (i < 0) { 
    cout << "warning: value out of bounds" <<endl; 
    return elt[0]; 
    } 
    else if (i > size) { 
    cout << "warning: value out of bounds" <<endl; 
    return elt[size]; 
    } 
    else 
    return elt[i]; 
    } 

このエラーが発生しましたまたは配列のインデックスされた位置に値24を代入しようとしたとき

error: assignment of read-only location ‘arr2.IntArray::operator’ arr2[1] = 24;

何が間違っていますか?

答えて

1

constへの参照が返されます。つまり、エラーメッセージごとに「読み取り専用の場所」です。しかし、あなたはそれをとにかく修正しようとしています。このため

int& operator[] (int i) { 
    // same as before 
} 

仕事に、正しい型持つように修正する必要がeltint*をあなたがする何を意味するのか

は非constへの参照を返すでした。結局、intの配列はcharの配列ではなくなります。


注:範囲外のエラーを印刷することはあまり役に立ちません。例外をスローするか、指定されたインデックスが境界内にあることを単にアサートすることをお勧めします。

+0

確かに、このエラーが発生します:エラー:int型のrvalueから型 'int&'の非const参照の無効な初期化 return elt [0]; – flowpoint

+0

@flowpoint 'elt'とは何ですか?質問に追加してください。 – Barry

+0

更新された記事を参照してください – flowpoint

関連する問題