2016-08-31 9 views
2

私は最近CとJavaをたくさん使ってきましたので、なぜこれが許されないのか、C++に戻ってくるのはちょっと混乱しています。C++ - 不完全なクラスタイプですか?

incomplete type is not allowed

#pragma once 

class Expression 
{ 
private: 
    Expression power; // <--- incomplete type is not allowed 
}; 

私はここで答えはExpression *powerにラインExpression powerを変更することであると考えているが、それは、なぜ私は理解していません。 vector<int> varのようなオブジェクトをポインタなしで宣言できますが、2番目のオブジェクトは宣言されているファイルと同じ型のオブジェクトを持っています。私は周りを見回しましたが、クラスのオブジェクトを作成するチュートリアル/ビデオは見つかりません。

+11

クラスを埋め込むことはできません。二度考えます:それは無限の再帰を引き起こします。代わりにポインタを使用するか、スマートポインタを使用してください。 –

+0

無限再帰問題の他に、クラスのメンバを定義するために不完全型を使用することはできません。なぜなら、コンパイラはそのメンバのクラスインスタンスで確保する領域の量を知ることができないからです。タイプが不完全であるため、クラスがどれほど大きいかはまだ分かりません。 –

+0

あなたのデザインを再考する、解決策としてこれを必要とする実際の問題はありません – user463035818

答えて

3

クラスのインスタンスを内部に配置した場合、すべてのインスタンスに独自のExpression powerがあるため、再帰を作成しています。これは永遠に続きます。あなたがポインタを持っているなら、いつでも再帰を終了するためにpowernullptr(またはNULL/0、pre C++ 11)に設定できるので、この無限再帰を制御することができます。

+0

私は参照してください。私は、なぜこのような行がJavaではまったく問題なく動作するのだろうが、C++ではそれほど多くの問題を引き起こすのだろうかと疑問に思います。 – Hatefiend

+3

Javaでも同じことが起こります。次のようになります。http://stackoverflow.com/questions/8023319/declaring-an-instance-of-a-class-inside-that-c​​lass唯一の違いは、コンパイラは決して知らないでしょう –

+0

はい、しかし、そのユーザーは 'Animal'1 = new Animal();を' Animal'クラスの宣言で行っています。ここでは 'Animal object1; 'を初期化せずに入力しています。それは私が得意でないことのようなものです。 – Hatefiend

関連する問題