[英]Why isn't this compiling?
我不明白為什么下面的代碼無法構建:
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
需要將函數AguiPoint::getX()
和AguiPoint::getY()
定義為const
成員函數,否則您將無法在const AguiPoint
上調用它們。
您試圖在p
上調用非const
成員函數,該函數引用了const AguiPoint
。 由於引用是別名原始對象,調用一個非const
上一個成員函數const AguiPoint &
相當於調用非const
上一個成員函數const AguiPoint
,這是一個錯誤。
這是一個錯誤,因為由於未將方法聲明為const
,因此無法保證它不會修改const AguiPoint
實例。 沒有這種保證,編譯器必須假定它將以某種方式修改const AguiPoint
對象,並且嘗試修改const
對象是一件壞事,即違反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 */ }
};
另外,由於函數AguiRectangle::pointInside()
不會修改AguiRectangle
任何數據成員, AguiRectangle
您也應該將AguiRectangle::pointInside()
定義為const
成員函數:
bool AguiRectangle::pointInside(const AguiPoint &p ) const // Note const
{
/* Implementation */
}
const正確性是C ++中一個重要且基本的概念,因此請務必閱讀有關const正確性的FAQ和本周權威文章#6 。 甚至在Wikipedia上有一篇關於const-correctness的不錯的文章 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.