2014-07-11 3 views
0

기본적으로 두 개의 다른 헤더 파일 아래에 두 클래스가 있습니다. ToolBarNewMenu (더 나은 이해를 위해 실제 클래스 이름을 사용합니다.)이 두 클래스는 모두 namespace map입니다. 이제 클래스 ToolBar 안에 선언 된 클래스 NewMenu이 있습니다. 그러나 이벤트를 처리하지만 ToolBar 클래스를 매개 변수로 사용하여 발생하는 이벤트를 기반으로 특정 정보를 전달하고 편집하는 NewMenu (HandleEvents(..., ToolBar& toolBar))의 멤버 함수가 있습니다. 그러나 이것은 순환 종속성을 유발하는 것으로 보입니다.C++ A 클래스를 B 클래스의 멤버 함수에 대한 매개 변수로 사용하는 클래스 B 클래스 A의 멤버가

그래서 기본적으로 ... 나는

// ToolBar.h 
#include "NewMenu.h" 

namespace map 
{ 
class ToolBar 
{ 
private: 
    NewMenu myNewMenu; 

public: 
    /* ... */ 
} 
} // namespace map 

////////////////////////// 

// NewMenu.h 
#include "ToolBar.h" 

namespace map 
{ 
class NewMenu 
{ 
private: 
    /* ... */ 

public: 
    void HandleEvents(ToolBar& toolBar) 
    { 
     /* ... */ 
     //Use ToolBar function 
     toolBar.tileMap.Create(); 

     /* ... */ 
    } 
    /* ... */ 
} 
} // namespace map 

그러나,이 순환 의존성을 야기 ... 이런 식으로 시작했다. 그래서 그 다음이 문제를 해결하려고 몇 가지 조사를했고, 이런 걸 가지고 ...

// ToolBar.h 
#include "NewMenu.h" 

namespace map 
{ 
class ToolBar 
{ 
private: 
    NewMenu myNewMenu; 

public: 
    /* ... */ 
} 
} // namespace map 

////////////////////////// 

// NewMenu.h 
//#include "ToolBar.h" 

namespace map 
{ 
class ToolBar; //(I presume) to make a temporary reference to class ToolBar. 
class NewMenu 
{ 
private: 
    /* ... */ 

public: 
    void HandleEvents(ToolBar& toolBar) 
    { 
     /* ... */ 
     //Use ToolBar function 
     toolBar.tileMap.Create(); //Error: incomplete type is not allowed 

     /* ... */ 
    } 
    /* ... */ 
} 
} // namespace map 

나는 100 % 확실하지 않다,하지만, 이것은 기본적으로 문제를 해결해야 모여 무엇을 기반으로 (?), 그러나 이제는 HandleEvents() 함수에서 "오류 : 불완전한 유형이 허용되지 않습니다."라는 오류가 발생합니다. 그래서 내 질문은, 내가 무엇을 잘못하고 어떻게이 순환 종속성을 해결합니까?

(측면 참고 :. 나는 내 연구 here의 일부를 가지고 가끔 난 그냥 이해하는 약간 다른 방식을 보여 것을 필요하지만)

당신의 시간과 도움을 주셔서 감사합니다.

답변

3

주요 문제는 전달 선언으로 해결할 수없는 경우 순환 종속성을 가질 수 없다는 것입니다. handleEvents을 선언하는 것뿐만 아니라 컴파일러도 ToolBar의 크기를 알아야합니다. cpp 파일에서 구현을 옮기면 문제가 사라집니다.

B의 정의가 A의 크기를 알아야하고 B의 정의가 A의 크기를 알아야 할 필요가있는 경우 운이 떨어집니다. ToolBar 이후

문제에 대한 가장 좋은 해결책은 NewMenu은 다음과 유사한 방법으로 그것을 해결하는 것입니다 포함

NewMenu.h 알 필요하지 않기 때문에 문제가 해결이 방법으로
// ToolBar.h 
#include "NewMenu.h" // needed because you need to know the size of NewMenu 
class ToolBar { 
    NewMenu menu; 
    .. 
} 

// NewMenu.h 
class ToolBar; 

class NewMenu { 
    void HandleEvents(const ToolBar& toolBar); // <- look, it's a reference, no need to know the size of ToolBar 
} 

// NewMenu.cpp 
#include "NewMenu.h" 
#include "ToolBar.h" // you can safely include it here 
NewMenu::handleEvent(const ToolBar& toolBar) { 
    toolBar.whatever(); 
} 

ToolBar의 크기라면, 전방 선언으로 충분하므로 교차 포함이 없습니다.

+0

실제로 참조가 중요하지 않습니다. 불완전한 형식은 함수 선언의 매개 변수로 사용할 수 있지만 정의는 사용할 수 없습니다. 모든 필요한 유형의 정의 이후 클래스 외부로 함수 본문을 이동하는 것이 중요한 것입니다. –

+0

이것은 더 많은 톤을 돕습니다. 나는 .cpp 파일을 완전히 고려하는 것을 완전히 잊었다! 고맙습니다! NewMenu.cpp에'ToolBar.h'를 포함 시켰기 때문에 완벽하게 작동합니다. – Uulamock