2013-09-30 2 views
1

서로 참조하는 두 클래스에 문제가 있습니다. 문제를 해결하기 위해 인터페이스를 사용하려고했지만 클래스 재 정의와 같은 다른 문제가 발생했습니다. 나는 이것을 제대로하는 방법을 모르겠다.CLI에서 C++/CLI 순환 참조 문제 클래스

여기에 제가 한 일례가 있습니다. 참고 : 나는이 문제에 실제로 영향을 미치지 않는 모든 추가 속성과 메서드를 제거했습니다. 순환 참조없이 클래스를 다시 정의하지 않고 어떻게 다시 할 수 있습니까? 가능한 경우,이 예제를 템플리트의 올바른 레이아웃을위한 템플리트로 사용하십시오.

// componentClass.h 
//#include "controlClass.h" - Would cause a circular reference 
namespace test 
{ 
    //component class 
    public ref class componentClass sealed : Component 
    { 
    internal: 
     componentClass(controlClass ^control); 
    private: 
     controlClass ^_control; 
    }; 
} 

// controlClass.h 
#include "componentClass.h"; 
namespace test 
{ 
    //control class 
    public ref class controlClass: Control 
    { 
    public: 
     controlClass(); 
    private: 
     componentClass ^_componentClass; 
    }; 
} 

// controlClass.cpp 
#include "controlClass.h" 
controlClass::controlClass() 
{ 
    _componentClass = gcnew componentClass(this); 
} 

// componentClass.cpp 
#include "componentClass.h" 
componentClass::componentClass(controlClass ^control) 
{ 
    _control = control; 
} 

답변

3

일반적으로이 문제를 해결하는 가장 쉬운 방법은 두 클래스 선언을 하나의 헤더 파일 안에 넣고 두 번째 선언을 전달 선언하는 것입니다. 예를 들면 :

namespace test 
{ 
    // Forward declaration of controlClass 
    ref class controlClass; 

    //component class 
    public ref class componentClass sealed : Component 
    { 
    internal: 
     componentClass(controlClass ^control); 
    private: 
     controlClass ^_control; 
    }; 

    //control class 
    public ref class controlClass: Control 
    { 
    public: 
     controlClass(); 
    private: 
     componentClass ^_componentClass; 
    }; 
} 

그것은 여러 헤더 파일로이 작업을 수행 할 수 하지만 하나의 헤더 파일을 사용하여 제거주의와 복잡성이있다.

문제없이 각 클래스의 구현을 다른 소스 파일에 계속 제공 할 수 있습니다.

+0

고마워, 그게 내가 정확히 찾고 있었던 것입니다. 전방 참조에 대해서는 알고 있었지만 componentClass의 선언을 controlClass의 선언과 같은 include 파일에 포함시키지 않았습니다. –