2017-04-05 7 views
1

私は構造体C++はクラス構築時にクラスを構成するメンバーですか?

struct MyStruct { 
    MyStruct(XML cfg) { ... } 
    int m_1, m_2, ... ; 
} 

そして今、コンパイラは体mystruct私はtehの継承の再生を考えるいけない空のコンストラクタ

error: no matching function for call to ‘MyStruct::MyStruct()’ 
MyClass(XML cfg) { m_struct = MyStruct(cfg); } 

を持っていないことを不平を言っているクラス

class MyBaseClass { 
    public: 
    MyBaseClass() {}  
    MyStruct m_struct; 
} 

class MyClass : public MyBaseClass { 
    public: 
    MyClass(XML cfg) { m_struct = MyStruct(cfg); }   
} 

を持っていますそれは事実かもしれないので、私はそれを完璧に保った。 MyStructの空のコンストラクタを明示的に呼び出すことはありません。 m_structがメンバーなので、クラスMyClassはそれを行いますか?
それがそうである場合、メンバーを初期化しない方法があるのですか、これはメンバーとしてのポインタでのみ可能ですか?

は、私はちょうど私の構造に空のコンストラクタを追加することによって、または

MyClass(XML cfg) : m_struct = MyStruct(cfg) {} 

にコンストラクタを変更することでこの問題を解決することができ承知していますが、私はまさにここに何が起こっているか知りたいです。

+0

'struct'と' class'は同じです。彼らはここで有用なカテゴリを形成しません。 – juanchopanza

+0

私は構造体を使用します。なぜなら、それは2つのパブリックメンバーしか含んでいないからです。クラスそのものには私の例よりも多くが含まれています、私は私の例では最小限のものにしようとしています – chrise

+0

継承は実際にここでは役割を果たしません。 MyClassを完全に削除し、MyBaseClassをインスタンス化し、まったく同じ問題を抱えることができます。 – WhozCraig

答えて

1

クラス構築のクラス構成メンバーはありますか?

もちろんです。この問題は、MyBaseClassのコンストラクタで発生し、メンバーm_structを明示的に初期化しないと、デフォルトで初期化されますが、MyStructにはデフォルトのコンストラクタがありません。

これは、データメンバーだけでなく、基本クラスオブジェクトにも当てはまります。 MyClassのコンストラクタでは、基本クラスのコンストラクタが明示的に指定されていないため、デフォルトのコンストラクタであるMyBaseClassが呼び出され、上記のようにエラーが発生します。

あなたはMyStructのデフォルトコンストラクタを追加、またはメンバーm_structをintializeする明示的MyStruct::MyStruct(XML cfg)を呼び出すために、MyBaseClassのコンストラクタでmember intializer listを使用することができます。例えば

MyBaseClass() : m_struct(some_thing) {} 
+0

ありがとうございました。私はそれに気づいていませんでした。私はスマートポインタをインスタンス自体のメンバーとして使用していました.C++を使って数週間のうちに、実際にその問題を遭遇したことはありませんでした。 – chrise

+0

@chriseスマートポインタはデフォルトで構築できます。だからすべてうまいです。 – songyuanyao

1

メンバ初期化子を省略すると、コンパイラは引数を使用しないものを挿入します。したがって、エラー。

これは、コンストラクタ本体の内部でメンバを初期化する最初の抽出で、コンパイラが許可する場合、メンバが2回初期化されることを意味します。このようなコードは書かないでください。

関連する問題