gpt4 book ai didi

c++ - 智能指针是否能够从容器中删除对其对象的其他引用?

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:37 26 4
gpt4 key购买 nike

我想实现这个:

  • 对象 A 拥有一个对象 B(有一个指向它的指针)
    • 当对象 A 被销毁时,对象 B 也被销毁。
  • 对象 C 有一个指向对象 B 的指针的 std::vector。
    • 当对象 B 被销毁时,从对象 C 的 vector 中删除它的指针。

这是否可以通过组合不同的智能指针来实现?

最佳答案

让我们从角色的角度来思考(现在忽略线程):

对象A拥有B的生命周期

对象C是B生命周期的观察者

你没有说 A 和 C 之间是否存在关系,所以我假设 A 在其构造函数中知道 C 的参与(让我们将 C 用作可配置工厂)。

B 的生命周期事件有 2 个地方可以创建观察 - B 的构造函数/析构函数(坏 - 紧耦合)或中间工厂(更好 - 松散耦合)。

所以:

#include <memory>
#include <algorithm>

struct B {

};

struct C {
std::shared_ptr<B> make_b() {
auto p = std::shared_ptr<B>(new B(), [this](B *p) {
this->remove_observer(p);
delete p;
});
add_observer(p.get());
return p;
}

private:
void add_observer(B *p) {
observers_.push_back(p);
}

void remove_observer(B *p) {
observers_.erase(std::remove(std::begin(observers_), std::end(observers_), p),
std::end(observers_));
}

std::vector<B *> observers_;
};

struct A {
A(C &factory)
: b_(factory.make_b()) {}


std::shared_ptr<B> b_;

};


int main() {

// note: factory must outlive a1 and a2
C factory;

A a1(factory);
A a2(factory);
}

请注意,虽然我使用了 shared_ptr,但在这种情况下我可以轻松地使用 unique_ptr。然而,我会在指针中将 A 与删除器类型耦合 - 所以我要么必须创建我自己的类型删除删除器类型,要么将 A 更紧密地耦合到 C(我想避免)。

关于c++ - 智能指针是否能够从容器中删除对其对象的其他引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41060003/

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