Как инициализировать постоянные циклические ссылочные элементы

Например, у меня есть два класса

class Foo;
class Bar;

class Foo {
const Bar &m_bar;
...
};

class Bar {
const Foo &m_foo;
...
};

Позволять foo является объектом Foo а также bar является объектом Bar, Есть ли способ (нормальный или «взлом») для создания / инициализации foo а также bar что их члены m_bar а также m_foo будет ссылаться друг на друга (я имею в виду foo.m_bar является bar а также bar.m_foo такое ‘foo’)?

Разрешено добавлять любых участников Foo а также Bar, чтобы добавить родителей для них, чтобы они сделали шаблоны и так далее.

6

Решение

Что такое связь foo а также bar? Если у них есть внешний
связь, вы можете написать что-то вроде:

extern Foo foo;
extern Bar bar;

Foo foo( bar );
Bar bar( foo );

(Я предполагаю, что это конструкторы, которые устанавливают
ссылка на параметр.)

Конечно, это предполагает область имен и статическое время жизни.
(но анонимное пространство имен в порядке).

Если они являются членами класса, проблем тоже нет:

class Together
{
Foo foo;
Bar bar;
public:
Together() : foo( bar ), bar( foo ) {}
};

Если они локальные переменные (без привязки), я не думаю, что есть
решение.

РЕДАКТИРОВАТЬ:

На самом деле, локальные переменные имеют простое решение: просто
определить локальный класс, который имеет их в качестве членов, и использовать его.

6

Другие решения

Это не может работать, если я правильно понимаю вашу проблему, так как для создания панели объектов вам нужен Foo и наоборот.
Вы не должны использовать ссылки, а указатель вместо этого. Где вы можете создать оба объекта отдельно, а затем установить Bar в Foo и Foo в Bar.

class Foo
{
public:
Foo();
void setBar( const Bar* bar ){ _bar = bar; }

private:
const Bar* _bar;
}
// class Bar analog to Foovoid xxx:something(void)
{
Foo* f = new Foo;
Bar* b = nee Bar;
f->setBar(b);
b->setBar(f);
...
}
0