簡體   English   中英

可以將共享指針與非指針數據成員混合嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM