1
#include "iostream"
#include "vector"

class ABC {

};

class VecTest {

  std::vector<ABC> vec;

  public:

  std::vector<ABC> & getVec() const { //Here it errors out
      return vec;
  }

};

constを削除すると修正されますが、getVecが定数メソッドである場合はそうではありません。では、なぜこれが許可されないのですか?

4

5 に答える 5

10

おそらく行うべきことは、const参照を返すことです。

const std :: vector&getVec()const {return vec; }

getVecはconstメソッドであると言っているため、許可されていません。つまり、メソッドはこのオブジェクトを変更してはなりません。非const参照を返すと、そのオブジェクトが変更される可能性があるため、コンパイラーはそれを許可しません。

于 2009-01-29T04:42:07.350 に答える
4

メソッドがconstの場合、メソッドを呼び出してもオブジェクトの状態を変更できないことがコンパイラーに保証されます。

メソッドが内部メンバーへの参照を返す場合、メソッドのユーザーは参照を介してオブジェクトの状態を間接的に変更できます。

したがって、実際には、constメソッドは参照を返すことができません(オブジェクトの状態を間接的に変更できるため)。できることは、const参照を返すことです。したがって、ユーザーは内部メンバーにアクセスできますが、契約は維持されます。

例:

class X
{
    int&       getX();       // get a reference to X
    int const& getX() const; // get a reference to X BUT the interface guarantees
                             // the object will not change state.
    private:
        int x;
}; 

それを見る別の方法。
constオブジェクトがある場合。constメソッドの呼び出しのみが許可されています。constメソッドを呼び出すことにより、オブジェクトの内部メンバーへの参照を取得できる場合は、その状態を変更できます。これは、元のオブジェクトのconst(ness)に違反します。

于 2009-01-29T04:54:26.110 に答える
2

の戻りタイプはであるgetVec()必要がありますconst std::vector<ABC>&

于 2009-01-29T04:42:02.047 に答える
1

すでに述べたことに加えて、メソッドを const にすると、それが取得するオブジェクト インスタンス (thisポインター) は実質的に const になります。を返すときvecは、暗黙的に を返すことに注意してthis->vecください。

return this->vec; // it's a const std::vector<ABC> since "this" is const

「一貫性」を取り除くことはできません - . で明示的に取り除かない限りconst_cast<>

// to illustrate what's happening when you're returning from the function
std::vector<ABC> &return = this->vec; // can't assign const to non-const!

したがって、戻り値の型も const にする必要があります。

const std::vector<ABC> &return = this->vec; // all is good
于 2009-01-29T05:10:56.793 に答える
0

Ray Hidayatが言ったことに加えて、constメソッドはクラスメンバーへのconstアクセスしか持っていません。constメンバー変数への非const参照を返そうとしているため、失敗します。

const関数からメンバー変数の変更可能なバージョンに本当にアクセスする必要がある場合は、変数を変更可能と宣言できます。しかし、私はそれをお勧めしません。

于 2009-01-29T04:57:00.473 に答える