Я просматривал альтернативу использованию так много 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. Как мне обойти эти проблемы?
Я бы добавил, что в этом случае auto_ptr имеет лучшую комбинацию гибкости и простоты, поскольку он больше не нуждается в подсчете ссылок. –
Не слишком ли хорошо понятен auto_ptr, чтобы использовать его правильно, из-за «несколько странной» семантики копирования? –