2011-02-06 6 views
1

나는 세 개의 클래스가 있습니다 : TopClass에는 BottomClass 포인터의 인스턴스가 있습니다. BottomClass에는 HelperClass에 대한 포인터가 들어 있습니다. HelperClassTopClass에 대한 포인터를 유지합니다. 순환 의존성이 나타나고 HelperClass에 전달 선언이 필요합니다. 전달 선언이 순환 종속성을 수정하지 않는 이유는 무엇입니까?

이 모든

다음과 같은 코드 조각에 예시되어있다 :

#include "BottomLevel.h" 

namespace foo 
{ 
    class TopLevel 
    { 
    private: 
    BottomLevel* item; 
    }; 
} 

-

#include "HelperClass.h" 

namespace foo 
{ 
    class BottomLevel 
    { 
    private: 
    HelperClass* item; 
    }; 
} 

-

class TopLevel; // forward declaration here 

namespace foo 
{ 
    class HelperClass 
    { 
    public 
    HelperClass(TopLevel* item); 
    }; 
} 

구현 파일에서 일을하려고 할 때 문제가 온다 . cpp 파일에서 #include "TopClass.h"이 발생하면 "과부하 된 멤버 함수를 찾을 수 없음 - 정의되지 않은 유형 'TopLevel'"(오류 C2511 및 C2027) 사용과 같은 컴파일 오류가 발생합니다.

그럼 내가하지 않으면 #include 앞으로 선언 된 형식을 사용하려고하기 때문에 C2027 오류가 남아 있습니다.

이 문제를 해결할 수있는 방법이 있다는 것을 알고 있습니다. 이전에 해본 적이있을 것이라고 확신하지만, 내 인생에서 내가해야 할 일을 기억할 수는 없습니다. 어떤 도움을 주시겠습니까?

답변

6

컴파일러가 foo::TopLevel 클래스를 찾지 못하도록 foo 네임 스페이스 외부에서 TopLevel을 앞으로 선언하는 것이 문제입니다.

foo 네임 스페이스 안에서 TopLevel의 전방 선언을 이동해보십시오. 당신 선생님, 저를 겸손 한 -

+0

/마른 세수는 [당신이 포인터를 사용하기 때문에] – Anthony

0

당신은 늘 문제가 그런 형태

namespace foo { 
class TopLevel; 
class BottomLevel; 
class HelperClass; 
} 

의 전방 선언 순서가 필요합니다. 감사!

+6

Shynthriir이 정확히 무엇을 넣어야하는지 알아내는 Stack Overflow의 또 다른 흥미 진진한 에피소드가 다음 주에 선보입니다! – Maxpm

+0

미안하지만 잘못된 부분에 마지막 부분을 입력하고 있습니다. :) –

관련 문제