2016-05-05 49 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];}