2016-12-13 4 views
-1

ネストされたクラスフィールドの値を設定するコンストラクタ初期化リストを作成する方法はありますか? 例えば:親クラスのコンストラクタ初期化リストを使用してネストされたクラスフィールドの値を設定する

の.h

class A { 
    public: 
     A(int tmp); 
     class B{ 
      friend A; 
      int x; 
     }; 
     B b; 
    } 

た.cpp

A(int tmp): x(tmp){}; 

どのように正しく行うには、コンストラクタの初期化リストを使用していますか?それが可能ならば。

EDIT:この例の誤り。

+0

「A」には「B」は含まれていません。それをしたいのであれば、 'A'に' B'型のメンバ変数を追加し、それを初期化する必要があります。 – Quentin

+0

'A'に' B'のメンバーがいますか?なぜインスタンス化しようとしていないのですか? – NathanOliver

+0

はい、申し訳ありません。コードを修正しました。クラスAにはBオブジェクトがあります。 – Andrew

答えて

2

はい。 Aのメンバ初期化リストを使用してbを初期化することができます。通常、適切なBコンストラクタを呼び出しますが、この場合はBにはコンストラクタが実際には宣言されていませんが、標準の集約初期化が機能するほど単純です。

class A { 
public: 
    A(int tmp); 
    class B{ 
    public: 
     friend A; 
     int x; 
    }; 
    B b; 
}; 

A::A(int tmp) : b{tmp} {} 

注:Bのメンバーを公開する必要がありました。それをしたくない場合は、コンストラクタを宣言する必要があります。

+0

私はここでそのアイデアは実際には得られません。 'A :: A(int tmp):b {tmp} {}'は値をxにどのように設定するのですか?別のフィールド 'int y'もあるとどうなりますか? – Andrew

+0

'struct B {int x、int y} b = {1};'と書くのとまったく同じです。 'b.x'は最初のメンバーであり、1に初期化されます.'b.y'はゼロで初期化されます。 C++の 'struct'と' class'の間の*唯一の違いがメンバーとベースのデフォルトアクセスであることを思い出してください。他には何もない。 –

関連する問題