2010-03-21 68 views
2

为什么我不能使用函数ColPeekHeight()作为l值?如何使这个函数像一个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

你的意思是'ColPeakHeight'? – 2010-03-21 13:56:57

+0

编译器抱怨这个声明是好的 - 它没有效果。 ColPeekHeight()返回整数的一个副本,所以你正在修改函数返回的副本! – AshleysBrain 2010-03-21 14:53:19

+0

@Emile,没有ColPeekHeight不是一个错字 - 我确实是指Peek。 (这是一张纸牌中每张牌的可见像素数量,在单人纸牌游戏中)。 – BeeBand 2010-03-21 17:18:43

回答

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

+0

AraK,当我用两个'const'声明函数时,我得到“你不能分配给一个常量变量”...... – BeeBand 2010-03-21 13:11:59

+0

@BeeBand:确保'v'不是const第一个。 – kennytm 2010-03-21 13:13:24

+0

@KennyTM,'v'是对'View'的非const引用。 – BeeBand 2010-03-21 13:16:29

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); 
} 
相关问题