0

なぜこれは違法であり、いくつかの論理的な代替案は何ですか?

// State.h
class State {

public:
int a;
int b;
State z; //  <-- this is this problem

// ... Functions ...

};

ありがとうございました。

4

4 に答える 4

7

許可されている場合、インスタンスを作成するたびに、インスタンスが作成され、インスタンスが作成され、インスタンスが作成され、インスタンスも必要にStateなるため、 ...のインスタンスが作成されます。StateStateStateState

また、sizeof(State). コンパイラに優しくしてください。

代わりにポインタの型を維持すれば問題ありません。State補足として、 aが独自の (public) を持つことは本当に意味がありStateますか? つまり、次のようなコード行を見るのは大好きですが、ばかげている可能性があります...

if(state.z->z->z->z->z->z->z->z == some_state) {
    // we found the right state!
}

シングルトンを作成しようとしている場合は、コンストラクターをプライベートにしてget_instance、の唯一の (静的) インスタンスを返す静的関数を追加しますState

于 2013-03-07T03:51:44.070 に答える
2

zはローカル変数であるため、クラス全体をスキャンするまで、必要Stateなストレージ容量を知ることはできません。それState自体に依存するため、無限に再帰します。

基本的に、コンパイラで何が起こるかは次のとおりです。

I see a class state.  Okay!
I now see a member variable a.  Okay!  Let's add 4 bytes to the size of our state
I now see a member variable b.  Okay!  Let's add 4 bytes to the size of our state
I now see a State.  Okay!  Let's see, our current size is 4 + 4, 
    now let's add the size of State to that, which is... um... ????

一方、ポインターはコンパイル時に既知のサイズ (通常は 4 バイトですが、アーキテクチャによって異なります) を持っています。このように、何かのサイズがわからない場合でも、常にポインターを持つことができます。重要な事ではない。

これは、その時点でコンパイラで何が起こるかです:

I see a class state.  Okay!
I now see a member variable a.  Okay!  Let's add 4 bytes to the size of our state
I now see a member variable b.  Okay!  Let's add 4 bytes to the size of our state
I now see a State*.  Okay!   Let's add 4 bytes to the size of our state
I now see that class state has ended.  Its size is 4 + 4 + 4 = 12.
I can now do State z;  It will take 12 bytes of space.
于 2013-03-07T03:59:22.630 に答える
1

zのすべてのインスタンスには別のzのインスタンスが含まれるため、これは無限の数の状態zなるため、非論理的です。ポインター状態*zは、そのような制限がないため許可されます

于 2013-03-07T03:51:33.507 に答える
0

State *代わりにaを使用してください。これにより、ある時点で再帰を終了できます。

于 2013-03-07T03:52:05.117 に答える