2011-02-10 19 views
2

Array obj;Array* obj = new Array;の違いを理解していないと、配列インデックス演算子[]がオーバーロードされています。私がオブジェクトへのポインタを持っているとき、私はこれらのエラーメッセージをVS 2010に取得します。配列の添え字演算子のオーバーロード

エラーC2679:バイナリ「=」:なしオペレータは
があり得る「INT」タイプの右側のオペランドをとる(または全く許容される変換は存在しない)が見つかりません「配列&アレイ::演算子=(CONST

#include <iostream> 
class Array 
{ 
    int arr[10] ; 

    public: 
     int& operator[](int index) 
     { 
      return arr[index] ; 
     } 
}; 

int main() 
{ 
    //Array* obj = new Array; Error 

    Array obj; // Correct 
    for(int i=0; i<10; ++i) 
     obj[i] = i; 

    getchar(); 
    return 0; 
} 

『(配列、int型)「引数リストに一致しようとしたときに、』アレイ&)は、いくつかのいずれかは、演算子のオーバーロードのためのインスタンスの2種類の間の理論的根拠を説明できますか?ありがとう。

+0

類似して:http://stackoverflow.com/questions/2808030/subscript-operator-on-pointers – coelhudo

答えて

10

Array *objの場合、obj[i]はと等価であるため、Arrayオブジェクトとして評価されます。

あなたはArray*のためではない、Arrayためoperator[]を定義し

int main() 
{ 
    Array* obj = new Array; 

    for(int i=0; i<10; ++i) 
     (*obj)[i] = i; 

    getchar(); 
    return 0; 
} 
+2

"それはArrayオブジェクトに評価される"ので、非常に奇妙で曖昧な主張です。私はobjが配列の連続した配列の最初であると仮定し、(i + 1)番目(配列のインデックス付けは0から始まる)に移動すると仮定します。その場合、そのアドレスのArrayオブジェクトにiを直接代入しようとしますが、 'Array :: operator =(int)'や 'Array(int)'コンストラクタはありません。ちょうど同様に;-)、そのようなサイレントエラーは未定義のランタイム動作を作成し、気付いて修正するのが難しくなります。 –

1

行う必要があります。コメントアウトされたコードでは、Array*を作成します。実際には、任意のポインタ型の演算子をオーバーロードすることはできません。ポインタに[]を適用すると、それを配列として扱い、配列インデックスをポインタ算術に変換します。従って、[]Array*に適用すると、Array(実際にはArray&)が得られます。 Arrayにはintを割り当てることはできません。その理由は定義していないからです(どちらにもしたくない)。

最新のよく書かれたC++は、キーワードnewをごくまれに使用しています。あなたのC++コードにキーワードnewが含まれていないことを疑ってはいけません。 はいつでも疑わしいはずです

関連する問題