【问题标题】:c++ classes linked to each other with std safe pointers (c++)c++ 类通过标准安全指针相互链接 (c++)
【发布时间】:2015-09-04 14:17:59
【问题描述】:

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

在我的应用程序中,我有 Library 类。此类具有内部 vectorBook 对象。这些对象通常在Library 类中创建,尽管外部代码使用函数从中查询Books 对象并稍后使用它们。每个Book 实例都有一个指向“主机”Library 实例的公共指针。

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

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

【问题讨论】:

  • Library 指针在Book 中的用途是什么?
  • 图书对象用于脚本系统,例如,它们必须包含该指针。

标签: c++ oop pointers c++11 weak-ptr


【解决方案1】:

有可能。

由于Library 需要知道如何添加一本书,它需要知道如何为自己获取weak_ptr。幸运的是,有一个名为 enable_shared_from_this 的辅助基类可以让你这样做。

#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。您可以通过将构造函数设为私有并使用返回 shared_ptr 的静态创建函数来强制执行此操作。

【讨论】:

    【解决方案2】:

    我认为弱指针对你没有帮助。

    不如看看如何更好地实现 Library 类。图书馆当然应该知道哪些书属于它。在删除库的情况下,它应该清理其内存并更新属于它的所有对象。

    当图书馆被删除时,这本书会发生什么?

    宁可使用std::unique_ptr

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2015-10-18
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      相关资源
      最近更新 更多