当我之前实现观察者模式时,我总是习惯于在监听器内部拥有对所有者的引用。在听众的照片中,我使用了寄存器,而在dtor中,我曾经注销过。
但这一次我不想持有一个参考来保持这些类之间的弱耦合。
我想出一个implementation with weak-ptr. 我的问题是,如果没有unsubscribe方法和weak-ptr可以实现观察者模式吗? 有没有我可以遇到麻烦的情况?
答案 0 :(得分:1)
是的,对观察者使用weak_ptr
是很自然的选择。
但是,您的实现有一个数据竞争,其中elem
在您的循环期间到期,您可能想要改为
for (auto elem : listenerList)
{
auto locked = elem.lock();
if (locked) { locked->update(val); }
else { anyExpired = true; }
}