2

関数を左辺値として使用できないのはなぜColPeekHeight()ですか?

class View
{
    public:
        int ColPeekHeight(){ return _colPeekFaceUpHeight; }
        void ColPeekHeight( int i ) { _colPeekFaceUpHeight = i; }
    private:
        int _colPeekFaceUpHeight;
};

...

{
    if( v.ColPeekHeight() > 0.04*_heightTable )
        v.ColPeekHeight()-=peek;
}

コンパイラは で文句を言いv.ColPeekHeight()-=peekます。左辺値を作成するにはどうすればよいColPeekHeight()ですか?

4

2 に答える 2

9

参照によってメンバー変数を返します。

int& ColPeekHeight(){ return _colPeekFaceUpHeight; }

クラスを適切なものにするには、関数の const バージョンを定義します。

const int& ColPeekHeight() const { return _colPeekFaceUpHeight; }

const2 つの sで関数を宣言すると

オブジェクトを変更することを期待していない関数にオブジェクトを渡したい場合。次の例を見てください。

struct myclass
{
    int x;
    int& return_x() { return x; }
    const int& return_x() const { return x; }
};
void fun(const myclass& obj);

int main()
{
    myclass o;
    o.return_x() = 5;
    fun(o);
}
void fun(const myclass& obj)
{
    obj.return_x() = 5; // compile-error, a const object can't be modified
    std::cout << obj.return_x(); // OK, No one is trying to modify obj
}

オブジェクトを関数に渡す場合、実際には常にそれらを変更したくない場合があります。したがって、この種の変更から身を守るためconstに、メンバー関数のバージョンを宣言します。すべてのメンバー関数に 2 つのバージョンがある必要はありません。それはそれ自体の機能に依存します、それは本質的に機能を変更しています:)

1 つ目constは、戻り値が定数であることを示しています。2 つ目constは、メンバー関数がオブジェクトを変更return_x しないことを示しています (読み取り専用)。

于 2010-03-21T13:07:41.637 に答える
1

次のように書き換えることができます。

class View
{
    public:
        int  GetColPeekHeight() const  { return _colPeekFaceUpHeight; }
        void SetColPeekHeight( int i ) { _colPeekFaceUpHeight = i; }
    private:
        int _colPeekFaceUpHeight;
};

...

{
    cph = v.GetColPeekHeight();
    if ( cph > 0.04 * _heightTable )
        v.SetColPeekHeight( cph - peek );
}
于 2010-03-21T14:30:54.483 に答える