Возьмите следующий пример:
class BookManager
{
...
};
class Book
{
public:
void setBookManager(BookManager *bookManager) {m_bookManager = bookManager;}
private:
BookManager *m_bookManager;
};
Поскольку вызывающий объект обычно не заинтересован в сохранении BookManager для Книги, если Книга удалена, и так как BookManager могут использовать несколько Книг, я делаю указатель на BookManager, общий указатель, например:
typedef std::shared_ptr<BookManager> BookManagerPtr;
class Book
{
public:
void setBookManager(BookManagerPtr bookManager) {m_bookManager = bookManager;}
private:
BookManagerPtr m_bookManager;
};
Проблема в том, что модуль в моем приложении имеет собственный BookManager, который он хочет передать каждой своей книге, например:
class MyModule
{
public:
Book *createBook()
{
Book *newBook = new Book();
newBook->setBookManager(BookManagerPtr(&m_bookManager));
}
private:
BookManager m_bookManager;
};
Конечно, это не работает, потому что последняя удаленная книга также удалит экземпляр BookManager, который он не должен удалять, поскольку он является обычным элементом данных MyModule.
Это означает, что MyModule должен также использовать общий указатель на BookManager, например:
class MyModule
{
public:
MyModule()
: m_bookManager(new BookManager())
{
}
Book *createBook()
{
Book *newBook = new Book();
newBook->setBookManager(m_bookManager);
}
private:
BookManagerPtr m_bookManager;
};
Это единственный способ решить это?
Или есть способ сохранить обычные элементы данных и использовать для них общие указатели (например, путем инициализации счетчика ссылок равным 1)?