为什么不编译?

时间:2010-10-10 01:48:47

标签: c++

我不明白为什么下面的代码没有构建:

bool AguiRectangle::pointInside(const AguiPoint &p )
{
    if(p.getX() < x) return false;
    if(p.getY() < y) return false;
    if(p.getX() >= x + width) return false;
    if(p.getY() >= y + height) return false;
    return true;

}

我明白了:

Error   1   error C2662: 'AguiPoint::getX' : cannot convert 'this' pointer from 'const AguiPoint' to 'AguiPoint &'  c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\aguibasetypes.cpp 259
Error   3   error C2662: 'AguiPoint::getX' : cannot convert 'this' pointer from 'const AguiPoint' to 'AguiPoint &'  c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\aguibasetypes.cpp 261
Error   2   error C2662: 'AguiPoint::getY' : cannot convert 'this' pointer from 'const AguiPoint' to 'AguiPoint &'  c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\aguibasetypes.cpp 260
Error   4   error C2662: 'AguiPoint::getY' : cannot convert 'this' pointer from 'const AguiPoint' to 'AguiPoint &'  c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\aguibasetypes.cpp 262

1 个答案:

答案 0 :(得分:15)

函数AguiPoint::getX()AguiPoint::getY()需要定义为const成员函数,否则您将无法在const AguiPoint上调用它们。

您试图在const上调用非p成员函数,该函数是const AguiPoint的引用。由于引用是原始对象的别名,因此在const上调用非const AguiPoint &成员函数等同于在const上调用非const AguiPoint成员函数,是一个错误。

这是一个错误,因为该方法未声明const,因此无法保证它不会修改const AguiPoint实例。如果没有这个保证,编译器必须假设它会以某种方式修改const AguiPoint对象,并且尝试修改const ant对象是一件坏事,即违反 const-correctness 。合理地符合C ++标准的编译器必须在这种情况下发出诊断信息。

假设AguiPoint::getX()AguiPoint::getY()只是该类的检查器方法,它们实际上应该是const,因为它们不会修改AguiPoint中的数据:< / p>

class AguiPoint
{
public:
    // Inspector methods - they don't change the data of an AguiPoint.
    int getX() const { /* Implementation */ } // Note const member function
    int getY() const { /* Implementation */ }
};

此外,由于函数AguiRectangle::pointInside()不会修改AguiRectangle的任何数据成员,因此您还应将AguiRectangle::pointInside()定义为const成员函数:

bool AguiRectangle::pointInside(const AguiPoint &p ) const // Note const
{
    /* Implementation */
}

正确性是C ++中一个重要的基本概念,因此请务必阅读this FAQ on const-correctnessthe Guru of the Week article #6。甚至还有一个非常好的Wikipedia article on const-correctness