我不明白为什么下面的代码不构建:
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的维基百科文章甚至还不错.
| 归档时间: |
|
| 查看次数: |
887 次 |
| 最近记录: |