gpt4 book ai didi

使用 std 安全指针相互链接的 c++ 类 (c++)

转载 作者:行者123 更新时间:2023-11-28 06:06:03 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

这是可能的。

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

关于使用 std 安全指针相互链接的 c++ 类 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32400324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com