1

JavaやC#のように、同じクラス内にクラスのオブジェクトを作成できますか?

/* State.h */
class State{
  private:
    /*...*/
    State PrevState;
};

エラー:

field 'PrevState' has incomplete type
4

3 に答える 3

2

書かれているようにこれを行うことはできません。変数をクラス(Type variablename)で直接何らかの型として宣言すると、変数の割り当て用のメモリがその親型の割り当ての一部になります。これを知っていると、なぜこれができないのかが明らかになります。割り当ては再帰的に拡張さ、メンバーにPrevStateスペースを割り当てる必要があります。さらに、この方法で無限の量のメモリを割り当てることができたとしても、コンストラクターの呼び出しは無限に繰り返されます。 PrevState

State &ただし、これらの型は固定サイズであるため、または(または一部のスマートポインター型)を含む型への参照またはポインターである変数を定義できますState *(参照は通常ポインターサイズであり、ポインターは次のいずれかになります)アーキテクチャに応じて、4バイトまたは8バイト)。

于 2012-07-25T03:00:14.813 に答える
0

あなたは間違えState PrevStateState* PrevStateいます。問題の原因は、C ++がJavaやC#のようなものであると想定していることです。そうではありません。C++のブラッシュアップに時間をかける必要があります。

于 2012-07-25T03:05:14.217 に答える
0

では、なぜこれをC#とJavaで実行できるのに、C++では実行できないのでしょうか。

C ++では、オブジェクトにサブオブジェクトを含めることができます。これが意味するのは、サブオブジェクトのメモリがそれを含むオブジェクトの一部になるということです。ただし、C#およびJavaでは、オブジェクトにサブオブジェクトを含めることはできません。State PrevState;これらの言語の1つで行う場合、メモリはコンテナの別の場所にあり、クラス内の実際のオブジェクトへの「参照」のみを保持します。C ++でこれを行うには、実際のオブジェクトへのポインターまたは参照を使用します。

于 2012-07-25T03:11:17.297 に答える