使用weak_ptr.lock()在死亡

时间:2017-08-07 09:44:21

标签: c++ observer-pattern weak-ptr

我目前正试图在一个小游戏中使用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;
};

0 个答案:

没有答案