2016-05-10 2 views
2

Возвращаясь по указателю или ссылке на C++, легко разбить круговые зависимости с помощью передовых объявлений. Но как вы это делаете в случае, когда вам нужно вернуться по стоимости?Возврат циклической зависимости C++ по значению?

Рассмотрим упрощенный пример ниже

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

struct Bar { 
    Foo foo; 
} 

Есть ли способ разорвать круговую зависимость? Пытаться направить объявление Бар просто приводит к жалобе о неполном возврате типа.

+0

Не определяйте функцию inline. 'struct Bar; struct Foo {Bar bar();}; struct Bar {Foo foo;}; Bar Foo :: Bar() {return Bar {* this};} ' – immibis

ответ

7

Определите два типа, объявив их функции-члены. Затем определите функции-члены вне класса и даже после определения второго класса.

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

struct Bar { 
    Foo foo; 
}; 

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

Ну, теперь я чувствую себя глупо. Я смутился сообщением об ошибке и думал, что проблема связана с типом возвращаемого значения, а не с встроенным определением. – Antimony

+0

Это действительно возвращение _statement_, которому нужна копия ctor. – MSalters

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