2016-05-10 3 views
2

Lors d'un retour par pointeur ou référence en C++, il est facile de casser les dépendances circulaires avec les déclarations forward. Mais avec vous faites-vous dans un cas où vous devez retourner en valeur?Dépendance circulaire C++ renvoyée par une valeur?

Prenons l'exemple simplifié ci-dessous

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

struct Bar { 
    Foo foo; 
} 

Est-il possible de briser la dépendance circulaire? Essayer de transmettre declare Bar conduit juste à une plainte sur un type de retour incomplet.

+0

Ne définissez pas la fonction en ligne. 'struct Bar; struct Foo {Barre de barre();}; struct Bar {Foo foo;}; Bar Foo :: Bar() {return Bar {* this};} ' – immibis

Répondre

7

Définissez les deux types en déclarant leurs fonctions membres. Définissez ensuite les fonctions membres en dehors de la classe, et même après la définition de la seconde classe.

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

struct Bar { 
    Foo foo; 
}; 

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

Eh bien maintenant je me sens idiot. J'ai été confus par le message d'erreur et j'ai pensé que le problème était avec le type de retour, pas la définition inline. – Antimony

+0

C'est vraiment le retour _statement_ qui a besoin du copy ctor. – MSalters