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