我正在实现一个类Aviary,它可以存储指向Bird对象的指针。现在,我有以下内容:
class Aviary {
public:
const Bird &operator[](const size_t index) const {
return birds[index];
}
Bird &operator[](const size_t index) {
return birds[index];
}
private:
std::vector<Bird*> birds;
Bird对象存储为指针,以避免对象切片。但是,运算符[] - 实现存在问题(对'const Bird'类型的引用无法绑定到'const value_type'的左值'(又名'Bird * const'))。
如何正确实现operator []?
答案 0 :(得分:1)
由于存储了指针,因此应该dereference
指针作为返回引用。
const Bird &operator[](const size_t index) const {
return *birds[index];
}
Bird &operator[](const size_t index) {
return *birds[index];
}
附注:使用智能指针,而不是原始指针。
答案 1 :(得分:1)
两个旁注:
const
)传递的参数中的const size_t index
是无用的,编译器将忽略它。您可以尝试使用const
声明它并删除实现中的const
:编译器将正确地认为您的实现与声明匹配。const
非operator[]
版本的规范方法如下:如下
Bird &operator[](size_t index) {
return const_cast<Bird&>(const_cast<const Aviary*>(this)->operator[](index));
}
我知道所有const_cast
看起来都很丑陋,但它们都是安全的,这是确保operator[]
的两个版本都做同样事情的正确方法(你只需要保持{{1}从现在开始的版本),同时还要确保您没有在const
版本中执行任何非const
操作。
除此之外,代码的问题在于你正在返回指针,而不是(引用)它们指向的值,正如Luchian和ForEveR已经指出的那样。
答案 2 :(得分:0)
您需要取消引用:
return *(birds[index]);
birds[index]
是Bird*
,因此您无法直接将其作为Bird&
返回。