2016-07-27 4 views
0

У меня возникают проблемы с круговой ссылкой типов. Для implmentation из следующих способов:Циклическая зависимость в классах шаблонов

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

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

Это требование заключается в том, что OtherType взять ссылку на объект EnclosingType так, что он может вызывать методы EnclosingType и EnclosingType может вызывать методы OtherType. Основная цель - предоставить разработчикам возможность создавать собственные типы, полученные из другого типа.

Каков наилучший способ обработки случая, когда существует такой тип циркулярной зависимости? Каково надлежащее объявление OtherType? Каково правильное объявление OtherType :: EnclosingType? Каково правильное объявление Enclosing :: OtherType :: type_? Это то, что мне нужно сделать, даже возможно?

Спасибо.

+1

'EnclosingType' не является типом; это шаблон. И у него нет методов. 'OtherType' также не имеет методов. Я не понимаю, что вы пытаетесь сделать. – melpomene

+0

проверить CRTP, это может быть полезно для этого сценария, хотя я не уверен, поможет ли вам решить вашу проблему. https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern –

ответ

1

Если я сделать предположение о том, что вы хотели OtherType содержать ссылку на EnclosingType<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_; 
}; 

Вы можете использовать EnclosingType декларацию (в отличие от определения) в OtherType, так как вы ссылаясь на него с помощью указателя или ссылки. Определение EnclosingType<OtherType> требует определения OtherType, потому что оно включает его по значению.

+0

Спасибо, это полезно, и я принимаю это как ответ. Тем не менее, я прошу у вас снисхождения и немного расширю вопрос. Каким будет шаблон, если EnclosingType требуется несколько (финитных) внутренних типов (например, OtherType1, OtherType2). В этом случае потребитель может выбирать только из производного от OtherType1 и использовать стандартную реализацию OtherType2. Требование экземпляров OtherType {n}, содержащих ссылку на экземпляр EnclosingType, все равно будет присутствовать. Мысли об этом? – user1612443

+0

Это другой вопрос. Пожалуйста, разместите его отдельно, чтобы другие могли воспользоваться позже. –

Смежные вопросы