簡體   English   中英

為什么不編譯?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM