繁体   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