2017-02-23 4 views
1

私は以下のように、初期化リストをテストするための簡単なプログラムを持っている:派生クラスのC++初期化リストがコンパイルに失敗しました。なぜですか?

#include<stdio.h> 
struct Base{ 
    Base():m_i(2){} 
    int m_i; 
}; 
struct Derived:Base{ 
    Derived():m_i(3){} 
}; 
int main() 
{ 
    Derived d; 
    return 0; 
} 

驚いたことに、それはコンパイルに失敗しました。 gccとclangの両方にエラーがあります:

1.cpp:7:15: error: member initializer 'm_i' does not name a non-static data member or base class 
    Derived():m_i(3){} 
      ^~~~~~ 

どこが間違っていましたか?

+0

何:

struct Base{ Base(int i=2):m_i(i){} int m_i; }; struct Derived:Base{ Derived():Base(3){} }; 

もう一つは、このように、単に変数を割り当てる代わりに、それを初期化することである:一つは、コンストラクタを使用して、それをパラメータとして、iの値を渡し、このようにすることですあなたは 'm_i'の価値があると思いますか? 3または2? – bejado

答えて

3

m_iDerived構造に使用することができるが、それは実際Derived構造の部材ないので、コンストラクタ初期化子リストで使用することができません。

コンストラクタ初期化子リストは、クラスまたは構造体のメンバーであり、基底クラスのメンバーではありません。または、基本クラスのコンストラクタを "呼び出す"。

あなたが引数としてm_iの値をとるBaseコンストラクタを追加し、Derived初期化子リストでそのコンストラクタを使用する必要があります。

Derived() : Base(3) {} 
3

コンパイラからエラーメッセージが十分に明確です。

m_iは、クラスの非静的データメンバーでも、基本クラスでもありません。したがって、あなたが3m_iの値を設定したい場合は、あなたがそれを行うには、コンストラクタの本体を使用することができます

Derived():m_i(3){} 

で使用することはできません。

Derived() { m_i = 3; } 
2

ファーストクラスの派生クラスを含む、あるクラスのメンバーを別のクラスから初期化することはできません。あなたが望むことができる方法はいくつかあります。

struct Derived:Base{ 
    Derived(){ 
     m_i=3; 
    } 
}; 
関連する問題