Циклические конструкторы

Предположим, что структуры A и B являются одноэлементными структурами, определенными следующим образом:

struct A
{
    B& b_;
    static A& shared_a() { ... }
    A() : b_(B::shared_b()) { ... }
};

struct B
{
    A& a_;
    static B& shared_b() { ... }
    B() : a_(A::shared_a()) { ... }
};

Предположим, что файловая структура организована так, что код будет компилироваться.

При первом вызове A::shared_a он создаст общий экземпляр A. Конструктор общего экземпляра A вызовет B::shared_b, который создаст общий экземпляр B. Затем конструктор общего экземпляра экземпляр B вызовет A::shared_a. Однако общий экземпляр A не завершил свой конструктор! Следовательно, эти конструкторы будут бесконечно зацикливаться.

Чтобы предотвратить такой цикл, я мог бы объединить классы A и B, но я хотел бы избежать этого. Есть ли более элегантное решение?

Спасибо,

Сэм


person Sam Hertz    schedule 07.05.2012    source источник
comment
Вы проверили проблему бесконечного цикла?   -  person jdizzle    schedule 07.05.2012


Ответы (2)


Ваш код демонстрирует неопределенное поведение, и вы можете столкнуться либо с упомянутым вами бесконечным циклом, либо с любым другим странным поведением. Теперь проблема не в том, как ее решить, а в том, чтобы сломать циклическую зависимость, которая обычно является запахом кода.

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

Опять же, я бы избегал циклической зависимости.

person David Rodríguez - dribeas    schedule 07.05.2012

Как насчет того, чтобы дать shared_a() ссылку на сам B, чтобы в конструкторе A_shared_a он мог установить эту ссылку как свою b_?

person cloudygoose    schedule 07.05.2012