2016-07-27 13 views
0

Ich habe Probleme mit einer Zirkelreferenz von Typen. Für eine implmentation der folgenden:Kreisförmige Abhängigkeit in Vorlagenklassen

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

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

Die Anforderung ist, dass eine OTHER Referenz auf ein Objekt der EnclosingType nehmen, so dass es Methoden, die auf EnclosingType aufrufen kann, und EnclosingType können Methoden auf OTHER aufrufen. Das Hauptziel besteht darin, es den Implementierern zu ermöglichen, ihre eigenen von OtherType abgeleiteten Typen bereitzustellen.

Was ist der beste Weg, um den Fall zu behandeln, in dem diese Art der zirkulären Abhängigkeit existiert? Was ist die korrekte Erklärung von OtherType? Was ist die korrekte Deklaration von OtherType :: EnclosingType? Was ist die korrekte Deklaration von Enclosing :: OtherType :: type_? Ist das, was ich tun muss, überhaupt möglich?

Danke.

+1

'EnclosingType' ist kein Typ; es ist eine Vorlage. Und es hat keine Methoden. 'OtherType' hat auch keine Methoden. Ich verstehe nicht, was du zu tun versuchst. – melpomene

+0

Überprüfen Sie CRTP, es könnte für dieses Szenario hilfreich sein, obwohl ich nicht so sicher bin, ob es Ihnen hilft, Ihr Problem zu lösen. https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern –

Antwort

1

Wenn ich davon ausgehen, dass Sie OtherType einen Verweis auf EnclosingType<OtherType> enthalten wollten, können Sie wie folgt vorgehen:

// 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_; 
}; 

können Sie verwenden, um die EnclosingType Erklärung (im Gegensatz zu Definition gegen) in OtherType da Sie Referenzieren über einen Zeiger oder Verweis. EnclosingType<OtherType> 's Definition benötigt die Definition von OtherType, weil es nach Wert enthält.

+0

Danke, das ist hilfreich und ich akzeptiere dies als die Antwort. Ich bitte jedoch um Nachsicht und erweitere die Frage ein wenig. Was wäre das Muster, wenn EnclosingType mehrere (finite) innere Typen benötigt (z. B. OtherType1, OtherType2). In diesem Szenario wählt der Consumer möglicherweise nur aus OtherType1 abgeleitet und verwendet eine Standardimplementierung von OtherType2. Die Anforderung von OtherType {n} -Instanzen, die einen Verweis auf eine EnclosingType-Instanz enthalten, wäre weiterhin vorhanden. Gedanken dazu? – user1612443

+0

Das ist eine andere Frage. Bitte poste es separat, damit andere später davon profitieren können. –