なぜこれは違法であり、いくつかの論理的な代替案は何ですか?
// State.h
class State {
public:
int a;
int b;
State z; // <-- this is this problem
// ... Functions ...
};
ありがとうございました。
許可されている場合、インスタンスを作成するたびに、インスタンスが作成され、インスタンスが作成され、インスタンスが作成され、インスタンスも必要にState
なるため、 ...のインスタンスが作成されます。State
State
State
State
また、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
。
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.
zのすべてのインスタンスには別のzのインスタンスが含まれるため、これは無限の数の状態zになるため、非論理的です。ポインター状態*zは、そのような制限がないため許可されます
State *
代わりにaを使用してください。これにより、ある時点で再帰を終了できます。