2011-04-09 70 views
0

基本上有予定义三个类:paralelogrampointline类,以及paralelogram有一些vector S的point S和line s,在所述paralelogram I类正在定义compute_area功能混乱上正在调用非const函数的const函数

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删除后工作的原因。

这对我来说是一个令人迷惑的地方,我不修改对象,但是它使用的对象给出了问题,而且我在想我还没有改变这些对象,但显然我的混淆const了解。还有一件事,这是否与thisParalelogram类的指针有关,如果是的话,你能澄清吗?

+0

你的'distance_to_line'函数是一个非const函数,对吗? – Nawaz 2011-04-09 15:59:38

+0

是的,我在帖子上做了一个修改。 – 2011-04-09 16:01:47

+2

“平行四边形” – Johnsyweb 2011-04-09 16:05:03

回答

3

在一个const功能,类型的每一个成员的成为这样一种方式,你不能修改它们(除非他们宣布mutable)const的,也不能使用它们调用任何非const功能。

看来,在你的代码,distance_to_line非const函数,但你从const功能,这意味着const函数里面points[3]points[0]成为const对象调用它,所以你不能调用非const函数(我相信distance_to_line是)在const对象上。

-

编辑:

你需要让distance_to_line一个const功能,因为该功能调用distance_to_point,你已经做甚至distance_to_point const函数。

1

要使成员函数为const,您不需要使成员变量为const。你只需要确保你的const函数不会修改该类的任何成员变量。

您是否尝试过对点类做distance_to_line()函数const?如果这样的话,你也可能需要制作distance_to_point() const。如果这些不是const,那么编译器不能确保调用函数也是const。

1

使distance_to_line()distance_to_point()常量和您的错误将消失。

1

通过声明函数const,您还可以限制您对任何成员的访问权 - 它们将被视为也是const。由于您无法在常量对象上调用非const成员函数,因此这些调用将失败。