Cas*_*sey 44 c++ compiler-errors
这个方法:
bool Point::Intersects(const Line& line) const {
return (line.ContainsPoint(*this, false));
}
Run Code Online (Sandbox Code Playgroud)
导致此错误:无法将'this'指针从'const Line'转换为'Line&'此更改:
bool Point::Intersects(const Line& line) const {
return const_cast<Line&>(line).ContainsPoint(*this, false);
}
Run Code Online (Sandbox Code Playgroud)
修复错误,但似乎不是解决问题的正确方法.为什么原始方法被认为是错误?
如果它有帮助,ContainsPoint(const Point& point, bool isInfinite)是非const,它调用的所有方法也是非const.
Ken*_*nde 63
从某种意义上说,你实际上是自己提供了答案.
在您的Intersects方法中,line声明参数const.这限制了您如何使用此变量.具体来说,您只能const在其上调用方法,并且只能将其传递给期望constLine对象的方法.
但是,你指出ContainsPoint没有声明const.所以它不满足上面提到的要求(即不允许const在const对象上调用非方法).这就是原始方法生成错误的原因,它也解释了为什么你的第二个版本有效,因为限制是通过const_cast.
真正的问题在于声明ContainsPoint(并且可能还有它所调用的任何方法,因为它们也是非const).这里似乎存在很大的设计缺陷.由于目的ContainsPoint是检查a Point是否在a上Line,副作用会出乎意料.因此,没有理由不将它作为一种const方法.其实(和你的例子显示了这一点),用户Line会希望 ContainsPoint成为一个const方法.因此,真正的解决方案是更改Line类的设计,以便ContainsPoint声明类似的方法const,并且只有明确更改实例状态的方法才会保留非const
在这种情况下,您在const引用上调用非const方法,这是不允许的.您有两种选择:
const_castContainsPoint一个const方法