Информация об изменениях

Сообщение Re: Порядок создания и удаления в графе от 27.12.2019 22:38

Изменено 27.12.2019 22:42 rg45

Re: Порядок создания и удаления в графе
Здравствуйте, 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 и удален раньше тоже не может быть. От изменения порядка членов b_ и c_ здесь тоже ничего страшного произойти не должно. Ведь B не владеет C, а значит и в деструкоре у него, по идее, не должно возникать никакого интереса, жив ли еще C или уже нет.

Ну а вообще, зависимости между объектами, конечно же, существуют на практике и правильная последовательность создания/удаления обычно достигается продуманным дизайном объектной модели.
Re: Порядок создания и удаления в графе
Здравствуйте, 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 или уже нет.

Ну а вообще, зависимости между объектами, конечно же, существуют на практике и правильная последовательность создания/удаления обычно достигается продуманным дизайном объектной модели.