此方法:
bool Point::Intersects(const Line& line) const {
return (line.ContainsPoint(*this, false));
}导致此错误:无法将' this‘指针从'const Line’转换为'Line &‘此更改:
bool Point::Intersects(const Line& line) const {
return const_cast<Line&>(line).ContainsPoint(*this, false);
}修复了错误,但似乎不是解决问题的正确方法。为什么原始方法被认为是错误的?
如果有帮助,ContainsPoint(const Point& point, bool isInfinite)是非常数,它调用的所有方法也都是非常数。
发布于 2011-07-08 10:46:35
在某种意义上,你实际上自己提供了答案。
在Intersects方法中,参数line被声明为const。这限制了您使用此变量的方式。具体地说,您只能对其调用const方法,并且只能将其传递给需要const Line对象的方法。
但是,您指出ContainsPoint并没有声明为const。因此它不满足上面提到的要求(即不允许在const对象上调用非const方法)。这就是为什么原来的方法会生成这个错误,也解释了为什么你的第二个版本可以工作,因为这个限制是通过const_cast减轻的。
真正的问题在于ContainsPoint的声明(可能还有它调用的任何方法,因为它们也是非const的)。这里似乎有一个很大的设计缺陷。由于ContainsPoint的目的是检查Point是否在Line上,因此副作用将是意想不到的。因此,它没有理由不是一个const方法。实际上(您的示例说明了这一点),Line的用户希望ContainsPoint是一个const方法。因此,真正的解决方案是更改Line类的设计,以便像ContainsPoint这样的方法被声明为const,并且只有明显更改实例状态的方法才保留为非const
发布于 2011-07-08 10:39:00
在这种情况下,您正在对const引用调用非常数方法,这是不允许的。您有两个选择:
const_cast
ContainsPoint a const method发布于 2011-07-08 10:55:04
问题其实很简单:
您有一个具有非常数方法foo()的类A,您正在通过引用const A来调用非常数方法foo()。
const A& a = ...;
a.foo(); // failed这就是const的目标: const变量意味着,它被声明为不会被更改。虽然foo()“将要改变自己”(因为foo()是一个非常量方法,这意味着:“我可以合法地改变内部的东西”),这就是为什么编译器会抱怨:你有一个const var (a),但是你要改变它的内容(通过foo())
解决的方法很简单,但你应该知道哪种方法是正确的:
1)如果您确定foo()应该合法才能通过const ref等调用,则应将其声明为const方法: A::foo() const {...}
2)如果你知道foo()不适合做const,你应该考虑
2.1)查看"a“,看看非常数是否更合适,或者
2.2)在A中找到另一个const方法来完成这项工作。
(还有一些其他的方法,比如使用可变的,或者const_cast,但是99.9%的时间都不是这样的。所以我没有在这里提到)
https://stackoverflow.com/questions/6619360
复制相似问题