2017-07-18 4 views
-3
struct structA 
{ 
    StructA(const int a) { ... } ; 
} 

、その後、私のメインの構造体:C++のコンストラクタ一致する関数がない

の.h

struct MainStruct 
{ 
    MainStruct(int x, int y) ; 
private : 
    int _x ; 
    int _y ; 
    StructA _s ; 

} 

* .cppファイル

StructA(int x, int y) : _x(x) , _y(y) 
{ 
    _s = StructA(x) ; 
} 

間違っていますか?

_s = StructA(x) ;StructA s = StructA(x) ;に置き換えてプライベートから削除すると問題なく動作します。何故ですか?

In constructor .... 
no matching function for call to 'StructA' 
         _y(y) 
+3

コンストラクタの本体を入力する前に、すべてのメンバーを完全に構築する必要があります。 '_s'はメンバ初期化子リストに適切なパラメータで指定されておらず、デフォルトコンストラクタもないので構築できません。 – user4581301

+1

これは、パラメータを使用してコンストラクタを宣言すると、デフォルトのコンストラクタがデフォルトで削除されるためです(明示的に宣言する必要があるため)。 –

答えて

1

すべてのクラスのメンバーが完全に構築されなければなりません。 _sは、member initializer listに適切なパラメータで指定されておらず、自動的に生成されたコードでコンパイラが使用するデフォルトコンストラクタがないため、構築できません。

クイックフィックス:私はStructA s = StructA(x) ;_s = StructA(x) ;を交換し、民間からそれを削除した場合、それは正常に動作

MainStruct(int x, int y) : _x(x) , _y(y), _s(x) 
{ 
} 

メンバー初期化子リストを使用してください。何故ですか? _sため

は今だけMainStructコンストラクタ内に存在するAutomatic variableです。もはやMainStructクラスメンバではないため、コンストラクタの本体を入力する前に初期化する必要はありません。これがコンパイルされている間、_sは、MainStructコンストラクタ内にしか表示されず、コンストラクタの最後で破棄されるため、完全に役に立たないことに注意してください。

0
struct structA 
{ 
    StructA(const int a) { ... } ; 
} 

あなたはそのコンストラクタにint型を提供する必要があるということです。

あなたMainStructはこれを行いません:あなたはイニシャライザでこれを並べ替えることができます

StructA(int x, int y) : _x(x) , _y(y) 
{ //by here we need to default construct the _s but cannot 
    _s = StructA(x) ; 
} 

:あなたは、コンストラクタの体内に入る前に、

StructA(int x, int y) : _x(x) , _y(y), _s(x) 
{ 
             //^--- look 
} 
関連する問題