gpt4 book ai didi

c++ - 为什么这不编译?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:18 24 4
gpt4 key购买 nike

我不明白为什么以下代码无法构建:

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 AguiPoint & 上调用非 const 成员函数等同于调用非 const const AguiPoint 上的成员函数,这是一个错误。

这是一个错误,因为该方法未声明为 const,因此无法保证它不会修改 const AguiPoint 实例。如果没有这个保证,编译器必须假设它会以某种方式修改 const AguiPoint 对象,并且试图修改 constant 对象是一件坏事,即违反 < em>常量正确性。在这种情况下,合理地符合 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::pointInside() 也作为 const 成员函数:

bool AguiRectangle::pointInside(const AguiPoint &p ) const // Note const
{
/* Implementation */
}

Const-correctness 是 C++ 中一个重要且基本的概念,因此请务必阅读 this FAQ on const-correctnessthe Guru of the Week article #6 .甚至还有一个相当不错的 Wikipedia article on const-correctness .

关于c++ - 为什么这不编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3898663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com