2016-07-27 3 views
0

순환 참조 유형에 문제가 있습니다. 다음의 implmentation 들어 :템플릿 클래스의 순환 종속성

// Parent.h 
template <typename OtherType> 
class EnclosingType 
{ 
public: 
    typename OtherType type_; 
}; 

class OtherType 
{ 
public: 
    EnclosingType & e_; 
    OtherType (EnclosingType & e) : e_(e) {} 
}; 

요건은 EnclosingType 메소드를 호출 할 수 있도록 OtherType가 EnclosingType의 목적에 대한 참조를 취하며 EnclosingType가 OtherType 메소드를 호출 할 수있다. 주요 목표는 구현자가 자신의 OtherType 파생 형식을 제공 할 수 있도록하는 것입니다.

이 순환 종속성 유형이있는 경우를 처리하는 가장 좋은 방법은 무엇입니까? OtherType의 적절한 선언은 무엇입니까? OtherType :: EnclosingType의 적절한 선언은 무엇입니까? Enclosing :: OtherType :: type_의 적절한 선언은 무엇입니까? 나는 심지어 할 수있는 일이 가능한가?

감사합니다.

+1

'EnclosingType'은 유형이 아닙니다. 그것은 템플릿입니다. 그리고 방법이 없습니다. 'OtherType'도 메소드가 없습니다. 네가하려는 것을 이해하지 못한다. – melpomene

+0

CRTP를 확인하십시오. 문제 해결에 도움이 될지 잘 모르겠지만이 시나리오에 도움이 될 수 있습니다. https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern –

답변

1

난 당신이 EnclosingType<OtherType>에 대한 참조를 포함 할 OtherType을 원하는 가정을하면, 다음을 수행 할 수 있습니다 (정의에 반대) 당신이 있기 때문에

// EnclosingType declaration 
template <typename T> 
class EnclosingType; 

// OtherType definition 
class OtherType 
{ 
public: 
    EnclosingType<OtherType> & e_; 
    OtherType (EnclosingType<OtherType> & e) : e_(e) {} 
}; 

// EnclosingType definition 
template <typename T> 
class EnclosingType 
{ 
public: 
    T type_; 
}; 

당신은 OtherTypeEnclosingType 선언을 사용할 수 있습니다 그것을 포인터 또는 참조를 통해 참조합니다. EnclosingType<OtherType>의 정의에는 OtherType이라는 정의가 필요합니다. 그 이유는 값으로 값을 포함하기 때문입니다.

+0

감사합니다. 도움이됩니다. 답변으로 받아 들일 것입니다. 그러나, 나는 당신의 방종을 빌며 질문을 약간 연장 할 것입니다. EnclosingType이 여러 (finiite) 내부 유형 (예 : OtherType1, OtherType2)을 필요로하는 경우 패턴이 무엇입니까? 이 시나리오에서 소비자는 OtherType1에서 파생 된 제품 만 선택하고 OtherType2의 기본 구현을 사용합니다. EnclosingType 인스턴스에 대한 참조를 보유하는 OtherType {n} 인스턴스의 요구 사항은 여전히 ​​존재합니다. 이것에 대한 생각? – user1612443

+0

그 또 다른 질문입니다. 다른 사람들이 나중에 혜택을 얻을 수 있도록 별도로 게시하십시오. –