2016-04-12 13 views
0

//内部構造体のデータメンバを初期化する方法がわかりません //構造体。私はこれがOOPのガイドラインに反すると信じています。以下のプログラムは、任意のコンパイラエラーを示すと罰金を実行して、初期値を渡すことができたにコンストラクタ、で行うの出力10 30C++で構造体のデータメンバを初期化

#include<iostream> 
using namespace std; 
struct Accumulator 
{ 
    int counter = 0; 
    int operator()(int i) { return counter += i; } 
}; 
int main(void) 
{ 
    Accumulator acc; 
    cout << acc(10) << endl; //prints "10" 
    cout << acc(20) << endl; //prints "30" 
} 
+2

あなたはそれは、余分なものを必要としない限り、 'のstd :: endl'を使用しないでくださいそうです。 '' \ n ''は行を終わらせます。 –

答えて

0

を与えていません。以下のような

何か:それはあまりにも、コンストラクタなしで働いているなぜあなたは不思議場合は、コンストラクタのない構造が集約であり、あなたがaggregate initializationを使用することができますので、

struct Accumulator 
{ 
    Accumulator(int initial = 0) 
     : counter(initial) 
    {} 

    int counter; 

    int operator()(int i) { return counter += i; } 
}; 

int main(void) 
{ 
    Accumulator acc(20); 
    std::cout << acc(10) << '\n'; //prints "30" 
    std::cout << acc(20) << '\n'; //prints "50" 

    // Reset accumulator 
    acc = Accumulator(); // Use constructors default argument 
    std::cout << acc(10) << '\n'; //prints "10" 
    std::cout << acc(20) << '\n'; //prints "30" 
} 

は、それはです。

counterメンバーの初期化については、それがnon-static data memberであり、C++ 11スタンダードのものがinitializedのようになっているからです。

+0

でも、コンストラクタがなくても、それは私の質問です。なぜなら、struct内部のデータメンバを初期化しているので、コンパイラエラーが表示されるはずですから。 – user3798283

+0

@ user3798283私の答えが更新されました。 –

1

クラスの初期化に関するルールが変更されました。 C++ 11以降では、静的でないクラスメンバーを直接クラス本体で初期化できます。しかしこれは構文的な砂糖です。あなたが書くとき

struct Accumulator 
{ 
    int counter = 0; 
    int operator()(int i) { return counter += i; } 
}; 

コンパイラは実際には、カウンタの初期化をデフォルトのコンストラクタに追加します。したがって、上記のコードは

struct Accumulator 
{ 
    int counter; 
    Accumulator() : counter(0) {} 
    int operator()(int i) { return counter += i; } 
}; 

に翻訳されます。独自の初期化を指定すると、この初期化も抑制されます。我々は

struct Accumulator 
{ 
    int counter = 0; 
    int sum = 0; 
    Accumulator() {} 
    Accumulator(int counter) : counter(counter) {} 
    int operator()(int i) { return counter += i; } 
}; 

を持っていた場合次に Accumulator() {}は実際に

Accumulator() : counter(0), sum(0) {} 

Accumulator(int counter) : counter(counter) {}は次のようになりだろう

Accumulator(int counter) : counter(counter), sum(0) {} 
関連する問題