2014-12-06 136 views
-2

我重載了一個運算符[],但它沒有按我的意願工作。重載運算符[]

class A{ 
     int *const e; 
     const int row, column; 
    public: 
     int rows() const 
     { 
      return row; 
     } 

     int columns() const 
     { 
      return column; 
     } 

     int size() const 
     { 
      return row * column; 
     } 

     A(int r, int c) 
      : row(r), column(c), e(new int[r*c]) 
     { 
      for (int i = 0; i < r*c; i++) 
      { 
       e[i] = 0; 
      } 
     } 

     virtual int *const operator[ ](int r) 
     { 
      return &e[r*row]; 
     } 
} 

例如: 如果我寫道:

A a(2, 5) 
a[0][0] = 1; // OK 
a[0][1] = 2; // OK 
a[0][2] = 3; // It's assigned a [0][2] == 3 but also [1][0] == 3 

我沒有發現問題。它應該爲[0] [2]分配一個值3 這段代碼有什麼問題?

回答

3

因爲a[0][2]a[1][0]是一個一樣的。讓我們看看:

&e[r*row]&(*(e+(r*row)))(定義[])相同,與(e+(r*row))相同。

如果r爲0,則這只是e,並且如果r爲1,則這是(e+row)。也就是說,假設您的row爲2,則爲e+2

所以a[0]返回ea[1]返回e+2

現在a[0][2](a[0])[2]e[2]a[1][0](e+2)[0]e[2]。看到?一樣。

如果row是行column數列的數量,因爲你的意圖似乎是,你是最好返回&e[r*column]operator[](因爲列數是一排的大小) 。

+0

哦好吧,我已經改變了,但我仍然有同樣的問題 – Cieja 2014-12-06 09:02:31

+2

如果你改正了它,你不能有同樣的問題。你可能有類似的問題,但不一樣。 – 2014-12-06 09:14:07

+0

是的,但我的意思是說結果是一樣的 – Cieja 2014-12-06 10:46:32