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

Bee*_*and 2 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;
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨v.ColPeekHeight()-=peek.我怎样才能ColPeekHeight()得到l值?

Ara*_*raK 9

通过引用返回成员变量:

int& ColPeekHeight(){ return _colPeekFaceUpHeight; }
Run Code Online (Sandbox Code Playgroud)

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

const int& ColPeekHeight() const { return _colPeekFaceUpHeight; }
Run Code Online (Sandbox Code Playgroud)

当我宣布函数两个const小号

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

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
}
Run Code Online (Sandbox Code Playgroud)

如果将对象传递给函数,则可能不希望实际上一直更改它们.因此,为了防止这种变化,您需要声明const成员函数的版本.它不一定是每个成员函数都有两个版本!它取决于它自己的功能,它是天生地修改功能:)

第一个const说返回值是常量.第二个const说成员函数return_x 不会更改对象(只读).

  • 虽然这会起作用,但通常不会以这种方式暴露类的内部结构 (4认同)
  • @BeeBand,为了防止这一点不清楚,AraK建议你同时制作这些功能,而不仅仅是const功能. (2认同)