我不明白为什么下面的代码没有构建:
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
答案 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-correctness和the Guru of the Week article #6。甚至还有一个非常好的Wikipedia article on const-correctness。