为什么不编译?

jma*_*erx 1 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;

}
Run Code Online (Sandbox Code Playgroud)

我明白了:

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

In *_*ico 15

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

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

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

假设AguiPoint::getX()并且AguiPoint::getY()只是类的检查器方法,它们确实应该是const,因为它们不会修改内部数据AguiPoint:

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

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

bool AguiRectangle::pointInside(const AguiPoint &p ) const // Note const
{
    /* Implementation */
}
Run Code Online (Sandbox Code Playgroud)

正确性是C++中一个重要且基本的概念,因此请务必阅读这篇关于const-correctness本周大师文章#6的常见问题解答.关于const-correctness的维基百科文章甚至还不错.