C++ 类存储指向C+中向量的指针+;

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:

我正在实现一个类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;
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 <代码>是无效的,编译器将忽略它。您可以尝试用<代码> const 声明它,并在实现中删除<代码> const :编译器将正确地认为您的实现与声明匹配。
  • 实现非
    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已经指出的那样