我目前正试图在一个小游戏中使用this作为参考来实现Observer模式。虽然,我试图实现本章中暴露的问题之一的解决方案:如何防止主题向被删除的观察者发送通知?
我没有使用简单的指针或拥有主题类中的观察者(使用vector
的shared_ptrs,简单指针或暗示拥有该对象的任何东西),我认为拥有{{ 1}}(知道已经使用make_shared和shared_ptr实例化了观察者)。对我来说,主要用途是能够检查观察者是否仍然活着weak_ptr
,如果不是,则将其删除,但这是一个好习惯吗?这是否意味着其他问题?
这是我的(精简版)代码:
主要方法:
weak_ptr.lock()
学科班:
int main() {
shared_ptr<Game> game = std::make_shared<Game>(); //Game extends subject
shared_ptr<Renderer> renderer = std::make_shared<Renderer>(); //Renderer extends observer
game.addObserver(renderer); //Automatic cast from shared_ptr to weak_ptr
}
观察员类:
class Subject {
public:
virtual void removeObserverAt(int index) {
m_observers.erase(m_observers.begin() + index);
}
protected:
virtual void notify(int objectID, Event ev, int64_t timestamp) {
int i = 0;
for(std::weak_ptr<Observer> obs : m_observers) {
if(auto sobs = obs.lock()) {
sobs->onNotify(objectID, shared_from_this(), ev, timestamp);
} else {
removeObserverAt(i);
}
i++;
}
}
private:
std::vector<std::weak_ptr<Observer>> m_observers;
};