JavaやC#のように、同じクラス内にクラスのオブジェクトを作成できますか?
/* State.h */
class State{
private:
/*...*/
State PrevState;
};
エラー:
field 'PrevState' has incomplete type
JavaやC#のように、同じクラス内にクラスのオブジェクトを作成できますか?
/* State.h */
class State{
private:
/*...*/
State PrevState;
};
エラー:
field 'PrevState' has incomplete type
書かれているようにこれを行うことはできません。変数をクラス(Type variablename
)で直接何らかの型として宣言すると、変数の割り当て用のメモリがその親型の割り当ての一部になります。これを知っていると、なぜこれができないのかが明らかになります。割り当ては再帰的に拡張され、メンバーにPrevState
スペースを割り当てる必要があります。さらに、この方法で無限の量のメモリを割り当てることができたとしても、コンストラクターの呼び出しは無限に繰り返されます。 PrevState
State &
ただし、これらの型は固定サイズであるため、または(または一部のスマートポインター型)を含む型への参照またはポインターである変数を定義できますState *
(参照は通常ポインターサイズであり、ポインターは次のいずれかになります)アーキテクチャに応じて、4バイトまたは8バイト)。
あなたは間違えState PrevState
てState* PrevState
います。問題の原因は、C ++がJavaやC#のようなものであると想定していることです。そうではありません。C++のブラッシュアップに時間をかける必要があります。
では、なぜこれをC#とJavaで実行できるのに、C++では実行できないのでしょうか。
C ++では、オブジェクトにサブオブジェクトを含めることができます。これが意味するのは、サブオブジェクトのメモリがそれを含むオブジェクトの一部になるということです。ただし、C#およびJavaでは、オブジェクトにサブオブジェクトを含めることはできません。State PrevState;
これらの言語の1つで行う場合、メモリはコンテナ外の別の場所にあり、クラス内の実際のオブジェクトへの「参照」のみを保持します。C ++でこれを行うには、実際のオブジェクトへのポインターまたは参照を使用します。