Я создаю класс, который будет частью DAG. Конструктор возьмет указатели на другие экземпляры и использует их для инициализации списка зависимостей.
После того, как список зависимостей инициализирован, его можно только сократить - экземпляр никогда не может быть добавлен в качестве зависимости от самого себя или любого из его дочерних элементов.
::std::shared_ptr
является естественным для обработки этого. Для обработки DAG были сделаны контрольные подсчеты.
К сожалению, зависимости должны знать своих иждивенцев - когда обновляется зависимость, она должна сообщить всем своим иждивенцам.
Это создает тривиальный цикл, который можно разорвать с помощью ::std::weak_ptr
. Зависимости могут просто забыть об уходящих иждивенцах.
Но я не могу найти способ для зависимого создать ::std::weak_ptr
для себя, пока он создается.
Это не работает:
object::object(shared_ptr<object> dependency)
{
weak_ptr<object> me = shared_from_this();
dependency->add_dependent(me);
dependencies_.push_back(dependency);
}
Этот код приводит к тому, что деструктор вызывается до выхода из конструктора.
Есть ли хороший способ справиться с этой проблемой? Я очень доволен решением только для C ++ 11.