0

我正在实现一个类 Aviary,它可以存储指向鸟对象的指针。现在,我有以下内容:

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[]?

4

3 回答 3

1

两个旁注:

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

如下

Bird &operator[](size_t index) {
  return const_cast<Bird&>(const_cast<const Aviary*>(this)->operator[](index));
}

我知道所有这些const_cast看起来都很丑,但它们都是安全的,这是确保两个版本都operator[]做同样事情的正确方法(你只需const要从现在开始维护版本),同时还要确保你没有做任何事情版本中不可const操作const

除此之外,您的代码的问题在于您返回的是指针,而不是(引用)它们所指向的值,正如 Luchian 和 ForEveR 已经指出的那样。

于 2012-10-04T10:15:08.080 回答
1

由于您存储指针,因此您应该dereference将指针用于返回引用。

const Bird &operator[](const size_t index) const {
return *birds[index];
}

Bird &operator[](const size_t index) {
return *birds[index];
}

旁注:使用智能指针,而不是原始指针。

于 2012-10-04T09:58:03.800 回答
0

您需要取消引用:

return *(birds[index]);

birds[index]是 a Bird*,所以你不能直接把它作为 a 返回Bird&

于 2012-10-04T09:58:03.490 回答