请看以下示例:

class BookManager
   {
   ...
   };

class Book
   {
   public:
      void setBookManager(BookManager *bookManager) {m_bookManager = bookManager;}
   private:
      BookManager *m_bookManager;
   };


由于调用者通常不希望在删除Book时保留一本书的BookManager,并且由于多个Book可以共享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不兼容

关于c++ - 可以将共享指针与非指针数据成员混合吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4375600/

10-11 16:25