C++ 类存储指向C+中向量的指针+;
我正在实现一个类Aviary,它可以存储指向Bird对象的指针。现在,我有以下几点:C++ 类存储指向C+中向量的指针+;,c++,pointers,vector,operator-keyword,C++,Pointers,Vector,Operator Keyword,我正在实现一个类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:
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;
class鸟舍{
公众:
常数鸟和运算符[](常数大小索引)常数{
返回鸟[指数];
}
Bird和运算符[](常量大小索引){
返回鸟[指数];
}
私人:
病媒鸟;
Bird对象存储为指针,以避免对象切片。但是,运算符[]-实现存在问题(对类型“const Bird”的引用无法绑定到“const value_type”(又名“Bird*const”)的左值)
如何正确实现运算符[]?您需要取消引用:
return *(birds[index]);
birds[index]
是一个Bird*
,因此您不能直接将其作为Bird&
返回,因为您存储了指针,您应该取消引用
指针以供返回引用
const Bird &operator[](const size_t index) const {
return *birds[index];
}
Bird &operator[](const size_t index) {
return *birds[index];
}
旁注:使用智能指针,而不是原始指针。两个旁注:
const
版本的运算符[]
的规范方法如下:Bird &operator[](size_t index) {
return const_cast<Bird&>(const_cast<const Aviary*>(this)->operator[](index));
}
Bird和operator[](大小索引){
返回常量强制转换(常量强制转换(this)->运算符[](索引));
}
我知道所有的const\u cast
看起来都很难看,但它们都是安全的,这是确保operator[]
的两个版本都相同的正确方法(从现在起,您只需要维护const
版本),同时还要确保您没有在const
版本中执行任何非const
操作
除此之外,代码的问题在于返回的是指针,而不是它们所指向的值(引用),正如Luchian和ForEveR已经指出的那样