2016-08-18 16 views
-5

なぜBASE *base_0 = new BASE(); //error?クラス定義時にメモリを割り当てますか?C++ 11クラス初期化エラー

class BASE { 

public: 
    int *i = new int(5);        
    BASE *base_0 = new BASE();  
    static const BASE base_1;  
    static BASE base_2;    
    ~BASE() { 
    cout << "~"; 
    } 

}; 
+4

um何ですか? 'BASE'を作成して' new'を介して別の 'BASE'を作成しないで、別の' BASE'ともう一つの 'BASE'を永遠に作成しますか?ここのユースケースは何ですか? – vu1p3n0x

+1

コンパイラから得たエラーを提供できますか? – JVApen

+1

合成されたメソッド 'constexpr BASE :: BASE()'が最初に必要です。 – QuantumEnergy

答えて

3

異なるコンパイラはあなたに別のエラーを与える:

struct S { 
    S* s = new S(); 
}; 

GCCの右バージョンで生成します。

prog.cpp:2:15: error: constructor required before non-static data member for 'S::s' has been parsed 
    S* s = new S(); 
      ^

http://ideone.com/8TU5Th

をあなたが実際にこの時点でnewを呼び出していないにもかかわらず、コンパイラはを解析し、newコールを解析する必要があります。デフォルトのctorを提供していないので、それを合成する必要がありますが、このメンバーはデフォルトのctorを参照するnewを参照しているため、この処理はできません。 ctor。

また、あなたは別の答えにあなたのコメントで「私はBASEの任意のオブジェクトを作成しない」、しかしで、実際にあなたが行うことを言う:

static const BASE base_1;  
static BASE base_2;    

これらのステートメントの両方がするプログラムが必要になりますデフォルトでBASEのインスタンスを起動時に初期化し、BASEのインスタンスが最初に行うことは、BASEの動的インスタンスを割り当てて、そのコンストラクタを呼び出すことです...

1

あなたは、コンストラクタが欠落している、デフォルトコンストラクタが作成される前に、新しいBASE()に記入しようとしています。あなたが受け取ったエラーはconstexpr BASE::BASE()です。あなたのクラスのどこにでもBASE::BASE()コンストラクタを追加すると、問題が解決するはずです。

ポインタを初期化するには、コンストラクタでもポインタを初期化することをお勧めします。

class BASE 
{ 

public: 
    BASE() 
    { 
    std::cout << "c"; 
    i = new int(5); 
    base_0 = new BASE(); 
    } 
    ~BASE() 
    { 
    std::cout << "~"; 
    } 

    int *i;        
    BASE *base_0; 
    static const BASE base_1;  
    static BASE base_2;     
}; 

私にはわからないことがありますが。新しいBASEをインスタンス化するときには、コンストラクタもコンパイルされます。これは新しいクラスがインスタンス化されるたびに発生するので、新しいBASEクラスをBASEコンストラクタ内でインスタンス化すると、メモリが不足するまで新しいBASEクラスをインスタンス化します。

本質的にフォークボンベです。

+0

anwserに感謝しますが、私はBASEのオブジェクトを作成しません、定義はメモリを割り当ててはいけません。私はちょうどこのようなクラスを定義し、エラーをコンパイルします:合成メソッド 'constexpr BASE :: BASE()'ここで最初に必要な、私がBASE(){}を上書きする場合は、このクラスのオブジェクト、何が起こったかもしれないと言いましたが、私はちょうどそれを定義している理由を知りたいだけです。コンパイルにもエラーがありますか?ありがとうございました! – QuantumEnergy

+0

これについて考える: "合成されたメソッド"はコンストラクタ "constexpr BASE :: BASE()"です。コンパイラは 'BASE * base_0 = new BASE()'という行を見て、それを合成する前に 'BASE :: BASE()'コンストラクタを見つけようとしています。 – mstehula

関連する問題