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";
}
要使其正常工作,Library
始终需要创建为 shared_ptr
。您可以通过使构造函数私有并具有 returns a shared_ptr
.
的静态创建函数来强制执行此操作
我的项目有问题。我相信 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";
}
要使其正常工作,Library
始终需要创建为 shared_ptr
。您可以通过使构造函数私有并具有 returns a shared_ptr
.