2016-05-05 74 views
3

我創建一個堆,就像這樣:C++重載數組運算符

struct Heap{ 
    int H[100]; 
    int operator [] (int i){return H[i];} 
    //...  
}; 

當我試圖打印從它的元素我這樣做:

Heap h; 
//add some elements... 
printf("%d\n", h[3]); //instead of h.H[3] 

我的問題是,如果不是訪問我想設置它們,像這樣:

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

我該怎麼辦?我不能只是這樣做...

謝謝!

回答

9

這是習慣,以提供夫婦operator[]函數的重載。一個用於const對象,另一個用於非const對象。 const成員函數的返回類型可以是const&或只是一個值,具體取決於返回的對象,而非const成員函數的返回類型可以是引用。

struct Heap{ 
    int H[100]; 
    int operator [] (int i) const {return H[i];} 
    int& operator [] (int i) {return H[i];} 
}; 

這允許您使用數組運算符修改非const對象。

Heap h1; 
h1[0] = 10; 

雖然仍允許您訪問const對象。

Heap const h2 = h1; 
int val = h2[0]; 
5

您可以返回應該設置的參考。將&添加到返回類型。

int& operator [] (int i){return H[i];} 
3

您應該通過參考返回。使用您當前的版本,您正在複製並編輯此副本,這不會影響原始數組。你必須改變你的操作符重載這樣的:

int& operator [] (int i){return H[i];}