基本上我定义了三个类:paralelogram
,point
和line
类,paralelogram
有一些vector
个point
s和line
s,在paralelogram
类中,我将compute_area
函数定义为
double Paralelogram::compute_area() const
{
assert( !points.empty() );
double h = points[3].distance_to_line( lines[0] ); // point[3] is the last point in
// the vector however it is not a
// const object, and this gives a
// compile time error
double base = points[0].distance_to_point( points[1] );
return base*h;
}
修改distance_to_line
功能不是 - const
double Point::distance_to_line(Line& l)
{
return l.distance_to_point(*this);
}
从函数定义和声明中删除const
可以解决问题,但是我在编码时的推理compute_area
不会修改对象,因此它可以是const
,但是这样是正确的,只要它在const
个对象上运行并调用const
个对象的函数,对吗?
如果point
对象也不是const
,则此信息不再有效。由于它们不是const
,因此const
移除后它才起作用。
对于我来说,这是一个令人费解的点,我不修改对象,但是它使用的对象会产生问题,而且我在想的是我仍然没有改变这些对象,但显然我的问题很混乱{ {1}}理解。还有一件事,如果你能澄清的话,这是否与const
类的this
指针有某种关系?
答案 0 :(得分:3)
在const函数中,每个成员的类型都变成const,你不能修改它们(除非它们被声明为mutable
),你也不能调用任何非成员const函数使用它们。
似乎在你的代码中,distance_to_line
是非const函数,但你是从const
函数调用它,这意味着在const函数points[3]
和{{1成为const对象,所以你不能在const对象上调用非const函数(我相信points[0]
)。
-
编辑:
你需要使distance_to_line
成为一个const函数,并且由于这个函数调用distance_to_line
,你必须使distance_to_point
const函数成为偶数。
答案 1 :(得分:1)
要使成员函数为const,您也不需要将成员变量设为const。您只需要确保const函数不会修改类的任何成员变量。
您是否尝试在点类上创建distance_to_line()
函数const?如果有效,你也可能需要制作distance_to_point()
const。如果这些不是const,则编译器无法确保调用函数也是const。
答案 2 :(得分:1)
点击distance_to_line()
和distance_to_point()
const,您的错误就会消失。
答案 3 :(得分:1)
通过声明函数const
,您还限制了对任何成员的访问权限 - 它们也会被视为const
。由于您无法在const对象上调用非const成员函数,因此这些调用将失败。