0

Birdオブジェクトへのポインタを格納できるクラス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オブジェクトは、オブジェクトのスライスを回避するためにポインタとして保存されます。ただし、operator []-の実装には問題があります(タイプ「constBird」への参照は「constvalue_type」(別名「Bird * const」)の左辺値にバインドできませんでした)。

operator []を適切に実装するにはどうすればよいですか?

4

3 に答える 3

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 に答える
1

2つのサイドノート:

  1. const値()で渡されたパラメータのinconst 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 に答える
0

逆参照する必要があります:

return *(birds[index]);

birds[index]はであるBird*ため、直接返すことはできませんBird&

于 2012-10-04T09:58:03.490 に答える