为什么我不能将函数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值?
答案 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 );
}