[英]Can you mix shared pointers with non-pointer data members?
請看以下示例:
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)?
創建一個副本BookManagerPtr(new BookMarkManager(m_bookManager))
,也將m_bookManager設置為BookManagerPtr或將book制作為模板,從而允許它使用BookManager *和shared_ptr。 shared_ptr是關於共享所有權的,在您的示例中,MyModule擁有該示例,而書不擁有,因此它與shared_ptr不兼容
使用自定義刪除程序怎么辦?
我知道您已經接受了答案,但是另一種方法(如果有幫助)可以使用引用。 默認情況下, Book
類中沒有引用成員,但是,如果將其包裝在可選的即boost::optional<BookManager&>
則可以具有引用,然后在setBookManager
方法中傳遞引用(或const引用)並將其分配給可選內容。 要使用,請像使用智能指針一樣取消引用...
對非所有權進行建模的安全方法是使用weak_ptr
這樣,生命周期仍由MyModule
控制,同時仍使Book
引用BookManager
並知道其引用的BookManager
是否仍然有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.