2009-05-11 9 views
0

以下の部分はVC++ 2008 Express Editionのものです。 教えてください、私は構造体のメンバーを持つクラスがあります。私はこのクラスのメンバー変数のデフォルト値を定義しようとしています。なぜこれはうまくいかないのですか?クラスの構造体メンバーのデフォルトの初期値

struct Country{ 
    unsigned chart id; 
    unsigned int initials; 
    std::string name; 
}; 

class world{ 
private: 
    Country   _country; 
    unsigned int _population; 
public: 
    world(){}; 
    world(): 
      _country(): 
       id('1'), initials(0), name("Spain") {}; 
      _population(543000) {} 
    : 
    : 
    ~world(){}; 
}; 
+1

最初に整形してください。 – Francis

答えて

6

国メンバーデータを初期化するには2通りの方法があります。このような...

struct Country{ 
    unsigned char id; 
    unsigned int initials; 
    std::string name; 
}; 

class world{ 
private: 
    Country   _country; 
public: 
    world() 
    { 
     _country.id = '1'; 
     _country.initials = 0; 
     _country.name = "Spain"; 
    } 
    ~world(){}; 
}; 

...または、このような...

struct Country{ 
    unsigned char _id; 
    unsigned int _initials; 
    std::string _name; 
    Country(
     unsigned char id, 
     unsigned int initials, 
     const std::string& name 
     ) 
     : _id(id) 
     , _initials(initials) 
     , _name(name) 
    {} 
}; 

class world{ 
private: 
    Country   _country; 
public: 
    world() 
    : _country('1', 0, "Spain") 
    { 
    } 
    ~world(){}; 
}; 

私のようにコンストラクタを定義したため、2番目の例では、私はそれが簡単に国のインスタンスを初期化するために見つけることに注意してくださいCountry構造体のメンバー。

または、おそらくあなたは、デフォルトコンストラクタを入力する国を与えたい:

struct Country{ 
    unsigned char _id; 
    unsigned int _initials; 
    std::string _name; 
    Country() 
     : _id('1') 
     , _initials(0) 
     , _name("Spain") 
    {} 
}; 


class world{ 
private: 
    Country   _country; 
public: 
    world() 
    { 
    } 
    ~world(){}; 
}; 
+0

または両方:デフォルトのコンストラクタを提供し、別のコンストラクタは値のセット全体を取得します。 C++では、構造体はデータのみに限定されません。 +1 –

+0

デストラクタまたはコピーコンストラクタを用意する必要はありません。 –

2

構造が集合型です。

コンストラクタがないため、通常の角括弧で初期化することはできませんが、中括弧を使用して配列を初期化することもできます。

+0

あなたはそれをテストしましたか?私はそれを定義するときにその構文を使用してCountryインスタンスを初期化することができると推測していましたが、あなたが既に作成されたCountryインスタンスに割り当てていますが、 – ChrisW

+0

は、country_ = {'1'、0、 "Spain"}をコンストラクタ本体(中括弧)内に書くことができると信じています。これは、値で初期化された一時的なCountryオブジェクトを作成し、それをcountry_に代入する必要があります。効率的ではありませんが、うまくいくはずです。 –

+0

コンパイラに依存するようです。明示的に一時的なものを作成し、中括弧で初期化した後でそれをクラススコープのメンバに割り当てることは動作しますが、理論的には全く同じことですが、すべてのコンパイラで動作しないようです。 – Stinomus

関連する問題