Порядок создания и удаления в графе
Между объектами есть отношение зависимости. A зависит от B. B должен быть создан до A и жить дольше A. A имеет ссылку на B, возможно отягощённую владением. Граф зависимости всех объектов формирует DAG.
Вопрос, как организовать код так, чтобы компилятор проверял, что объекты создаются в топологическом порядке, и удаляются соотвественно в обратном, так что никто никогда не имеет протухших ссылок?
Желательно зависимость выражать как аргумент конструктора. Порядок созданния внутри одного скопа выражается естественным образом
struct A {
A(unique_ptr<B> b, unique_ptr<C> c): c_(move(c)), b_(move(b)) {}
unique_ptr<C> c_;
unique_ptr<B> b_;
}
struct B {
B(C* c): c_(c) {}
C* c_;
}
auto c = make_unique<C>();
auto b = make_unique<B>(c.get());
auto a = make_unique<A>(move(b), move(c));
Но порядок удаления легко поломать поменяв порядок членов в A.
Подсчёт ссылок (shared_ptr) решил бы проблему. Но он привносит другие проблемы, и по ряду причин переписывание на shared_ptr не является опцией.
Нужно чтобы зависимости приходили классам снаружи, ибо DI.