2012-01-12 4 views
4

앞으로 선언문을 사용하여 how this can be made to work을 읽었습니다.상호 재귀 클래스가 가능합니까?

class A 
{ 
    public: 
    B *objB; 

    void foo(){} 
} 

class B 
{ 
    public: 
    A *objA; 

    void foo(){} 
} 

이 디자인이 가능한지 확인하고 싶습니까?

class A 
{ 
    public: 
    B objB; 

    void foo(){} 
} 

class B 
{ 
    public: 
    A objA; 

    void foo(){} 
} 

PS : 왜이 ​​몇 가지 예를 인용하여 같은, 오히려 단지 언어의 측면에서보다 논리적 클래스의 측면에서 가능한 이유/사람도 설명해주십시오 수 있다면. 이것이 수업의 관점에서 정확히 무엇을 의미합니까?

답변

9

두 번째 예는 불가능합니다. A에 할당 된 공간에는 B의 공간이 포함되어 있으며 A 등의 공간이 있습니다. 이렇게하려면 무한한 양의 메모리가 필요하며 구성하는데 무한한 시간이 걸립니다.

2

아니요, 언어 측면이나 수업 측면에서는 불가능합니다.

클래스 측면에서 : 모든 A 인스턴스에는 ... => 무한 재귀 인 A 인스턴스가 포함 된 B 인스턴스가 포함되어 있습니다. 포인터가 유효한 개체를 가리 키지 않거나 모든 A 포인터가 같은 개체를 가리킬 수 있기 때문에 포인터 버전에 문제가 없습니다.

0

두 번째 예제와 같은 상호 재귀 클래스는 불가능합니다. 각 인스턴스에 다른 클래스의 해당 인스턴스가 있고 재귀를 중지 할 기본 사례가 없으므로 클래스의 크기는 무한대가됩니다. 분명히 그런 큰 클래스를 인스턴스화하는 것은 어려울 것입니다.

-1

3.9/5는 말한다 :

선언하지만 드 Fi를 네드 된 클래스, 또는 불완전한 요소 유형의 알 수없는 크기의 배열, 불완전 드 Fi를 NED 객체 type.43 불완전 드 Fi를 NED 객체이다 유형 및 void 유형은 불완전한 유형 (3.9.1)입니다. 객체는 불완전한 유형으로 정의되어서는 안된다.

두 번째 예제에서 클래스 A는 불완전한 유형의 멤버 변수를 정의하려고 시도하므로 잘못 작성되었습니다.

관련 문제