Я искал альтернативу использованию такого количества shared_ptrs и нашел отличный ответ в разделе комментариев:
Вам действительно нужно совместное владение?
Если вы остановитесь и подумаете несколько
минут, я уверен, что вы можете определить одно
владелец объекта, а также ряд
пользователи, которые будут только когда-либо использовать
это при жизни владельца. Так
просто сделайте его локальным / членом объекта
владельцев и передать ссылки на
те, кому нужно его использовать.
Я бы с удовольствием это сделал, но проблема заключается в том, что для определения объекта-владельца теперь необходимо сначала полностью определить объект-владелец. Например, скажем, у меня есть следующее в FooManager.h:
class Foo;
class FooManager
{
shared_ptr<Foo> foo;
shared_ptr<Foo> getFoo() { return foo; }
};
Теперь, следуя приведенному выше совету, FooManager.h становится:
#include "Foo.h"
class FooManager
{
Foo foo;
Foo& getFoo() { return foo; }
};
У меня есть две проблемы с этим. Во-первых, FooManager.h больше не легкий. Каждый файл cpp, который включает его, теперь должен также компилировать Foo.h. Во-вторых, я больше не могу выбирать, когда инициализируется foo. должен быть инициализирован одновременно с FooManager. Как мне обойти эти проблемы?