【问题标题】:c++ classes linked to each other with std safe pointers (c++)c++ 类通过标准安全指针相互链接 (c++)
【发布时间】:2015-09-04 14:17:59
【问题描述】:
我的项目有问题。我相信来自新的 c++ stabdards 的共享/弱指针可以解决它,但我不清楚如何解决。在我读到的关于标准库的书中,我没有评论如何使用这些指针。
在我的应用程序中,我有 Library 类。此类具有内部 vector 的 Book 对象。这些对象通常在Library 类中创建,尽管外部代码使用函数从中查询Books 对象并稍后使用它们。每个Book 实例都有一个指向“主机”Library 实例的公共指针。
有时外部代码会删除 Library 并创建新的,但它仍可能使用旧库中先前查询的 Book 对象。我的问题是 Book 类应该删除不再有效的指针,因此 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