2016-05-10 13 views
2

Wenn durch Zeiger oder Verweis in C++ zurückgegeben wird, ist es einfach, zirkuläre Abhängigkeiten mit Vorwärtsdeklarationen zu brechen. Aber mit tun Sie in einem Fall, wo Sie nach Wert zurückgeben müssen?C++ zirkuläre Abhängigkeit, die nach Wert zurückgibt?

Betrachten Sie das vereinfachte Beispiel unter

struct Foo { 
    Bar bar() {return Bar{*this}; } 
}; 

struct Bar { 
    Foo foo; 
} 

Gibt es eine Möglichkeit, die zirkuläre Abhängigkeit zu brechen? Wenn Sie versuchen, die Deklarationsleiste weiterzuleiten, führt dies nur zu einer Beschwerde über einen unvollständigen Rückgabetyp.

+0

Definieren Sie die Funktion nicht inline. 'struct Bar; struct Foo {Balken bar();}; struct Balken {Foo foo;}; Bar Foo :: Bar() {return Bar {* this};} ' – immibis

Antwort

7

Definieren Sie die beiden Typen, indem Sie ihre Elementfunktionen deklarieren. Definieren Sie dann die Elementfunktionen außerhalb der Klasse und sogar nach der zweiten Klassendefinition.

struct Bar; 
struct Foo { 
    Bar bar(); 
}; 

struct Bar { 
    Foo foo; 
}; 

Bar Foo::bar() {return Bar{*this}; } 
+0

Nun, jetzt fühle ich mich albern. Ich wurde von der Fehlermeldung verwirrt und dachte, dass das Problem mit dem Rückgabetyp und nicht mit der Inlinedefinition war. – Antimony

+0

Es ist wirklich die Rückkehr _statement_, die die Kopie ctor benötigt. – MSalters

Verwandte Themen