如何使此功能像l值一样?

时间:2010-03-21 13:05:48

标签: c++ lvalue

为什么我不能将函数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 个答案:

答案 0 :(得分:9)

通过引用返回成员变量:

int& ColPeekHeight(){ return _colPeekFaceUpHeight; }

要使您的类成为一个好类,请定义函数的const版本:

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 :(得分: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 );
}