2013-03-07 2 views
0

왜 이것이 불법이며 어떤 논리적 대안이 있습니까?간단한 C++ 선언 문제

// State.h 
class State { 

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

// ... Functions ... 

}; 

감사합니다.

+0

'const를 주 *'같아요 객체의 포인터를 유지하기 위해? – Rapptz

+0

무한 재귀 때문에. 객체가 어떻게 자체의 객체를 포함 할 수 있습니까? –

+2

* 왜 이것이 불법입니까? * 허용 된 경우,이 객체의 한 인스턴스가 얼마나 클지 생각해보십시오. –

답변

7

이 없기 때문에 포인터 상태 * Z이 허용됩니다 음, State도 필요하므로 State ... 등의 인스턴스가 생성됩니다.

sizeof(State)을 알아 내려고하면서 컴파일러를 무한 재귀로 보낼 수도 있습니다. 귀하의 컴파일러에 친절하십시오.

대신 포인터 유형을 유지하면 괜찮을 것입니다. 보조 메모에서 State이 자신의 (공개) State을 갖는 것이 실제로 의미가 있습니까? 당신이 싱글을 만들려면 생성자는 비공개로하고 정적 get_instance 기능을 추가하려고한다면 나는

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

... 나는 다음과 같은 코드의 라인을보고 사랑합니까하지만 말도 얻을 수있는, 의미있는 State의 유일한 (정적 인) 인스턴스를 반환합니다.

+2

LOL ur 설명 :-P – NirmalGeo

+0

다른 대안으로'z'가'static' 저장 기간을 갖도록하는 것입니다. 이것은'State' 만 제안하는 경향이 있습니다. –

+0

@ ta.speot.is : 나는 * 당신이 싱글 톤 시도에 대해 옳을 수도 있다고 생각합니다. –

1

비논리적 Z 모든 인스턴스 Z 그것에 등의 다른 인스턴스가되므로이 상태 Z의 무한대에서 끝날 때문이다. 이 허용 된 경우, 때마다 당신이 다음 만들고 State의 인스턴스와 것 State의 인스턴스를 생성 할 State의 인스턴스를 생성하기 때문에이 그러한 제한

0

대신 State *을 사용하십시오. 이렇게하면 어느 시점에서 재귀를 끝낼 수 있습니다.

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.