在C ++中存储指向vector的指针的类

时间:2012-10-04 09:56:25

标签: 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:
    std::vector<Bird*> birds;

Bird对象存储为指针,以避免对象切片。但是,运算符[] - 实现存在问题(对'const Bird'类型的引用无法绑定到'const value_type'的左值'(又名'Bird * const'))。

如何正确实现operator []?

3 个答案:

答案 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)

两个旁注:

  1. 通过值(const)传递的参数中的const size_t index是无用的,编译器将忽略它。您可以尝试使用const声明它并删除实现中的const:编译器将正确地认为您的实现与声明匹配。
  2. 实施constoperator[]版本的规范方法如下:
  3. 如下

    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&返回。