Порядок создания и удаления в графе
От: SuhanovSergey  
Дата: 27.12.19 16:18
Оценка:
Порядок создания и удаления в графе

Между объектами есть отношение зависимости. 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.