2016-11-17 51 views
1

C++を初めて使用しています。私はこのコードをstructを作成して、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 

エラーがラインconst struct circle c1 = {2.0};c1です。誰も私にここでエラーを指摘することはできますか?

+0

「変更可能」はほとんどありません。 OTOH、PIはおそらく 'static constexpr double'でなければなりません(別のサークルを持っていれば、PIのコピーは必要ありません)。うんざりすると、メインの外側でサークルの宣言を動かす必要があります。最後に 'using namespace std; 'を使わないでください。 –

答えて

5

circleの名前をstruct定義の最後に右中括弧の後に置くと、変数が宣言されます。

単語をstructの後ろに入力して、型を宣言します。

I.e.他のニュースで

struct circle 
{ 
    // ... 
}; 

  • あなたはconstインスタンス、すなわちdouble getArea() constにそれを呼び出すことができるようにconstとしてgetArea()を宣言する必要があります。

  • 最後にreturn 0;は必要ありません。mainのデフォルトです。他の機能にはこのようなデフォルトはありません。 mainは特別です。修飾されていないcoutを使用するためには

  • (それはあなたがしたいと思われるよう)あなたは、コードの先頭にusing namespace std;を追加することができます。それは通常、インクルードの後に​​置かれます。


mutableは、通常、常に非constようなオブジェクトの一部を治療する外部コードを可能にするために使用されません。

その代わりに、より簡単にオブジェクトは外のコードへconstように表示されたとき、クラスの実装はまた、いくつかの非const状態を持ってみましょうするための装置として使われています。それは論理定数と呼ばれています。たとえば、オブジェクトは、たとえそれがconstであっても、高価な計算の結果をキャッシュすることがあります。

C++ 17以降mutableはラムダ式にも適用できます。ラムダ式では、状態(キャプチャ値)を変更できるラムダが生成されます。

+0

メインの最後に' return 0; 'は必要ありませんが、そうしないと貧弱なスタイルです。私は 'using namespace std;'を避け、 'cout'と' endl'を修飾することを推奨します。 –

+0

@MartinBonner:些細なプログラムのために 'main'の' return'を省略することは、確かに貧弱なスタイルではありません。反対に、ソースコードは主に読者と通信するので、コードが失敗に対処しているかのように「戻り」を追加します。そうでない場合は、読者に真実を伝えることです。そしてそれは、IMNSHOの意見、貧弱なスタイルです。 –

+0

私は同意しません。明示的は暗黙的より優れています。 –

7

circleという名前の構造を定義しないで、という変数circleと定義します。この変数は型として使用することはできません。

struct circle { ... };を使用して構造体を型として定義します。そして、あなたは他のいくつかの問題があります

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

行うことができ、最も注目に値するあなたがconstオブジェクトにそれを呼び出すことができないことを意味constとしてgetArea関数を宣言しないでください。

関連する問題