2011-04-09 74 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成員函數,因此這些調用將失敗。