Мне интересно, как (используя С++ 11 и, надеюсь, с обратными (boost или TR1) совместимыми типами интеллектуальных указателей) достичь:
Один экземпляр класса (ModelController
) владеет ресурсом (InputConsumer
), а другой компонент (InputSender
, который в данном случае является синглтоном) имеет к нему доступ.
Модель InputSender
содержит список ссылок на InputConsumers
, которых будет много.
ModelController
может не иметь ни одного, иметь один или много InputConsumers
, и может быть много ModelController
. InputSender
НЕ знает.
Вот что было бы неплохо: способ для InputSender
отслеживать назначенные ему InputConsumers
таким образом, чтобы он мог самостоятельно выяснить, действительны ли отдельные InputConsumers
или нет.
Мне кажется, что weak_ptr
идеально подходят для этой цели, так как их использование требует проверки этого условия.
Если InputSender
перестанет отслеживать какой-либо из своих weak_ptr
ссылок, ничего страшного не произойдет, соответствующие InputConsumer
будут просто находиться в режиме радиомолчания.
Если ModelController
удаляется или если ModelController
удаляет некоторые из своих InputConsumer
, любые InputSender
, зарегистрированные с ними, узнают в следующий раз, когда они попытаются получить к ним доступ, что они больше не существуют, и могут очиститься без необходимости отправлять сообщение или сделать что-нибудь.
Итак, вопрос в том, является ли это подходящей ситуацией для использования shared_ptr
и weak_ptr
? Интересно, полностью ли подходит shared_ptr
, потому что InputConsumer
концептуально владеют их ModelController
, поэтому они должны быть переменными-членами. Я не знаю, насколько разумно для ModelController
управлять ими только через shared_ptr
. Я не могу сказать, работает ли unique_ptr
вместе с weak_ptr
. Я должен просто управлять shared_ptr
s в ctor/dtor ModelController
?
Также может быть хорошо известный (не мне!) шаблон проектирования, в который это попадает, поэтому, если кто-нибудь знает о такой вещи, пожалуйста, сообщите мне.