c++ 类 使用标准安全指针相互链接 (c++)

c++ classes linked to each other with std safe pointers (c++)

我的项目有问题。我相信 shared/weak 来自新的 c++ 标准的指针可以解决它,但我不清楚如何解决。在我读到的关于标准库的书中,没有对我如何使用这些指针的想法发表评论。

在我的应用程序中,我有 Library class。此 class 有 vector 个内部对象,共 Book 个。这些对象通常在 Library class 内部创建,尽管外部代码使用函数从中查询 Books 对象并在以后使用它们。每个 Book 个实例都有一个 public 指向 'host' Library 个实例的指针。

有时外部代码会删除 Library 并创建新的,但它可能仍会使用以前从旧库中查询的 Book 对象。我的问题是 Book class 应该删除不再有效的指针,因此本书不会包含指向已删除库实例的无效指针。

我不清楚如何实现书 class 的弱指针来实现这种行为。

我认为弱指针不会帮助你。

而是着眼于更好地实现库 class。图书馆当然应该知道哪些书属于它。如果删除一个库,它应该清理它的内存并更新属于它的所有对象。

删除图书馆后图书会发生什么情况?

宁愿使用std::unique_ptr

有可能。

由于 Library 需要知道如何添加一本书,因此它需要知道如何为自己获取 weak_ptr。幸运的是,有一个名为 enable_shared_from_this 的助手库 class 可以让您做到这一点。

#include <memory>
#include <iostream>
#include <vector>

class Library;

struct Book {
  std::weak_ptr<Library> host_library;
};

class Library : public std::enable_shared_from_this<Library> {
    std::vector<Book> books;
 public:
  const Book& getBook(size_t index) const { return books.at(index); }
  void addBook() { 
      books.emplace_back();
      books.back().host_library = shared_from_this();
  }
};

int main() {
    auto library = std::make_shared<Library>();
    library->addBook();

    auto book_copy = library->getBook(0);              
    library.reset();                                   // Destroy the library

    auto old_library = book_copy.host_library.lock();  // Try to get a shared_ptr
    if (!old_library)                                  // to the library from the book.
        std::cout << "Library gone!\n";
}

Live demo.

要使其正常工作,Library 始终需要创建为 shared_ptr。您可以通过使构造函数私有并具有 returns a shared_ptr.

的静态创建函数来强制执行此操作