В последнем примере на странице 137 книги Effective Modern C++ показан сценарий структуры данных с объектами A
, B
и C
, соединенными друг с другом через std::shared_ptr
следующим образом:
std::shared_ptr std::shared_ptr
A ─────────────────▶ B ◀───────────────── C
Для меня это означает, что классы, экземплярами которых являются объекты A
и C
(как правило, это два несвязанных класса), должны содержать элемент std::shared_ptr<classOfB>
.
Затем делается предположение, что нам нужен указатель от B
обратно к A
, и перечисляются доступные варианты: указатель может быть необработанным, разделяемым или слабым, и последний выбирается как лучший кандидат.
std::shared_ptr std::shared_ptr
A ─────────────────▶ B ◀───────────────── C
▲ │
│ std::weak_ptr │
└────────────────────┘
Я понимаю слабости (ахахах) первых двух вариантов, но я также вижу, что третий вариант требует, чтобы член A
уже управлялся каким-то std::shared_ptr
, иначе как std::weak_ptr
вообще может указывать на него ?
Однако книга не ссылается на это ограничение/предположение/что-то еще, так что правда либо
- я не прав
- Я прав, но это предположение очевидно, по какой-то непонятной мне причине
- Предположение очевидно именно по той причине, что
std::weak_ptr
нуждается в уже существующемstd::shared_ptr
для того же объекта, но немного странно, что это даже не упоминается в начале примера, я думаю.
и я задаю этот вопрос, чтобы понять это.
A
не обрабатываетсяstd::shared_ptr
, альтернатив нет... - person Jarod42   schedule 19.11.2020weak_ptr
используется здесь только как средство фиксацииshared_ptr
петель. Либо вы уже управляли временем жизни A с помощью общего указателя, и в этом случае вы хотели бы использовать слабый указатель, либо вы вообще не рассматривали умные указатели, и в этом случае B не может убедиться, что A жив тем не мение. Альтернатив в любом случае нет. - person IS4   schedule 19.11.2020