我正在尝试模拟缓存。给定数组时,我必须确定operator[](size_t i)
是用于获取数据还是设置数据。我在其签名中使用const
重载了它,而没有它用于设置部分。
我的问题是,由于数组是动态分配的,因此只调用非const operator[]
。例如:
class A {
int n;
double *v;
public:
A(int i) : n(i),v(new double[i]) {}
const double & operator[](int i) const {
cout<<"get"<<endl ;
return v[i];
}
double& operator[](int i) {
cout<<"set"<<endl;
return v[i];
}
};
int main(){
double pi = 3.14;
A a(10);
a[2] = pi;
pi = a[3];
}
结果是
set
set
但我希望打印
set
get
答案 0 :(得分:3)
它与动态分配的数组没有任何关系。您的变量a
不是const
,因此将在其上调用非const
函数。如果您有const B b(10);
并且b[3]
,则会调用const
版本。
如果您真的想要,可以通过强制转换为const
引用来强制调用const
版本:
static_cast<const A&>(a)[3]
(或者,创建一个引用变量并在其上调用它)
答案 1 :(得分:2)
您已经发现为什么operator[]
是一个糟糕的界面&#39;对于类似缓存的操作,以及为什么每个人似乎都被std::map
的行为所困扰,如果你试图索引&#39;一个不存在的。
我会编写明确的get
和set
方法,这样您就不会对缓存类的用户感到惊讶。