2016-07-27 24 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_; 
}; 

あなたがいるので、あなたがOtherTypeで(定義ではなく)EnclosingType宣言を使用することができますそれをポインタまたは参照を介して参照します。 EnclosingType<OtherType>の定義はOtherTypeの定義が必要です。なぜなら、それは値によってそれを含むからです。

+0

ありがとうございます、それは役に立ちます。私はこれを答えとして受け入れています。しかし、私はあなたの贅沢を懇願し、少し質問を拡張します。 EnclosingTypeが複数の(finiite)内部型(例えばOtherType1、OtherType2)を必要とする場合のパターンは何でしょうか。このシナリオでは、コンシューマーはOtherType1から派生することのみを選択し、OtherType2のデフォルト実装を使用します。 EnclosingTypeインスタンスへの参照を保持するOtherType {n}インスタンスの要件は引き続き存在します。これについての考え? – user1612443

+0

それは別の質問です。後で他の人に恩恵を受けるように、別に投稿してください。 –