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

当我用两个consts声明函数时

当您想将一个对象传递给一个您不希望它修改您的对象的函数时。举个例子:

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 不会更改对象(只读)。

于 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 回答