2011-02-10 66 views
2

我無法理解Array obj;Array* obj = new Array;之間的區別,同時重載數組索引運算符[]。當我有一個指向對象的指針時,我在VS 2010上收到這些錯誤消息。數組下標運算符超載

錯誤C2679:二進制「=」:沒有操作員發現它採用類型「INT」的右邊的操作數(或沒有可接受的轉化率)
可以是「陣列&陣列::運算符=(const的陣列&)」,同時試圖匹配參數列表‘(陣列,INT)’

#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; 
} 

有人能解釋一下兩種運算符重載實例之間的原理是什麼?謝謝。

+0

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

回答

10

如果是Array *obj,obj[i]相當於,所以它評估爲Array對象。

你必須做的

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

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

    getchar(); 
    return 0; 
} 
+2

「因此它評估成一個數組對象」是一個非常奇怪和模糊的說法。我會說它假定obj首先在連續的數組陣列中,並且移動到(i + 1)(數組索引爲0)。然後會發生什麼,它試圖將i直接分配給該地址處的Array對象,並且沒有'Array :: operator =(int)'和'Array(int)'構造函數,所以這是不可能的。正如同樣;-),因爲這樣的沉默錯誤會導致未定義的運行時行爲,並且更難以注意和修復。 –

1

您的ArrayArray*定義operator[],沒有。在註釋掉的代碼中,您創建了一個Array*。實際上,你不能爲任何指針類型重載操作符。將指針[]應用於指針將其視爲一個數組,將數組索引轉換爲指針算術。因此,將[]應用於Array*會產生Array(確實是Array&)。您不能將int指定爲Array,因爲您沒有定義(也不想要)。

現代,寫得很好的C++很少使用關鍵字new。你不應該懷疑你的C++代碼不包含關鍵字new。你應該每次都懷疑它確實