Как я могу заставить эту функцию действовать как l-значение? - PullRequest
2 голосов
/ 21 марта 2010

Почему я не могу использовать функцию ColPeekHeight() в качестве l-значения?

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() значение l?

Ответы [ 2 ]

9 голосов
/ 21 марта 2010

Возвращает переменную-член по ссылке:

int& ColPeekHeight(){ return _colPeekFaceUpHeight; }

Чтобы сделать ваш класс хорошим, определите постоянную версию функции:

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

когда я объявляю функцию с двумя const 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 версию своих функций-членов.Не обязательно, чтобы каждая функция-член имела две версии!Это зависит от самой функции, является ли она модифицирующей функцию по своей природе:)

Первая const говорит, что возвращаемое значение является постоянным.Второй const говорит, что функция-член return_x не не изменяет объект (только для чтения).

1 голос
/ 21 марта 2010

Это может быть переписано как:

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 );
}
...