2016-11-17 70 views
1

我是C++新手。我有這個代碼來創建一個結構,以顯示在C++中使用mutable關鍵字。變量有初始值設定項但是不完整類型C++

#include <iostream> 

using namespace std; 

int main() 
{ 
    struct 
    { 
    mutable double radius; 
    double PI = 3.142; 

    double getArea() 
    { 
     return (PI * radius * radius); 
    } 
    } circle; 

    const struct circle c1 = {2.0}; 
    circle.radius = 7; 

    cout << "Area is " << circle.getArea() << endl; 

    return 0; 
} 

但是編譯時,我得到了以下錯誤消息:

error: variable const main()::circle c1 has initializer but incomplete type 

誤差在c1在該行const struct circle c1 = {2.0};。任何人都可以在這裏指出我的錯誤。

+0

你幾乎肯定不希望'mutable'在那裏。 OTOH,PI應該是'static constexpr double'(如果你有不同的圓圈,你不需要PI的不同副本)。令人煩惱的是,您隨後必須移動主要外部的圓的聲明。最後,不要使用'namespace std;' –

回答

5

當您在struct定義末尾的右大括號後面輸入名稱circle時,您聲明瞭一個變量。

把它放在開頭,在struct這個單詞後面,聲明一個類型。

I.e.

struct circle 
{ 
    // ... 
}; 

其他消息:

  • 你需要申報getArea()const能夠稱之爲一個const實例,即double getArea() const

  • 最後不需要return 0;,因爲這是main的默認值。其他功能沒有這樣的默認值。 main是特別的。

  • 爲了使用不合格的cout(看起來你想要),你可以在代碼的開頭添加using namespace std;;它通常放在包含之後。


mutable通常不用於允許代碼以治療對象的一部分一如既往非const

相反它用作設備更容易地讓一個類的實現有一些非const狀態也當對象似乎是const到外部代碼。這就是所謂的邏輯常量。例如,對象可能會緩存昂貴的計算結果,即使它是const

在C++中17和後mutable也可以應用於lambda表達式,在那裏它產生的λ,可以改變它的狀態(捕獲的值)。

+0

你不需要*'返回0;'在主結尾 - 但我會說這是不好的風格。我建議避免'使用名稱空間標準;'和限定'cout'和'endl'。 –

+0

@MartinBonner:在一個簡單的程序中忽略'main'中的'return'肯定不是一種不好的風格。相反,由於源代碼主要與讀者交流,因此在代碼中處理失敗的時候添加一個'return',否則就是向讀者傳遞一個不真實的信息。那就是IMNSHO的意見,風格很差。 –

+0

我不同意。顯式比隱式更好。 –

7

您沒有定義名爲circle的結構,您可以定義一個名爲circle變量。該變量不能用作類型。

你應該做struct circle { ... };將結構定義爲一種類型。然後,你可以做

const circle c1 = { 2.0 }; 
c1.radius = 7; 
std::cout << c1.getArea() << '\n'; 

還有一些其他的問題,最顯着的你不聲明getArea功能const這意味着你不能把它的上const對象。

相關問題