使用 smart_ptrs [重复]观察者模式发生崩溃

问题描述 投票:0回答:0

我正在尝试使用 C++ 11 智能指针实现观察者设计模式。下面是我的代码。如果我们试图从主题中删除观察者,下面的程序会崩溃。

  //observer
    
    class iobserver
    {
    
    public:
        virtual void update() = 0;
    
    };
    
    
    
    using ObserverSPtr = shared_ptr<iobserver>;
    class isubject
    {
    public:  
    
        virtual void notifyall() = 0;
        virtual void attach(ObserverSPtr obserber) = 0;
        virtual void detach(ObserverSPtr obserber) = 0;
    
        virtual int&  getState() = 0;
        virtual void setState(int state) = 0;
    };
    
    
    using ObserverList = list< ObserverSPtr>;
    using SubjectSptr = shared_ptr<isubject>;
    
    
    class Subject :public isubject
    {
        int state;
        ObserverList subscribed_observers;
    
    public:
    
        Subject()
        {
            state = -1;
            subscribed_observers.clear();
        }
        void attach(ObserverSPtr observer)
        {
            subscribed_observers.push_back(observer);
        }
    
        void detach(ObserverSPtr observer)
        {
            subscribed_observers.remove(observer);
        }
    
        void notifyall()
        {
            for (auto &observer : subscribed_observers)
            {
                observer->update();
            }
        }
    
        int& getState()
        {
            return state;
        }
    
        void setState(int state)
        {
           this->state = state;
           this->notifyall();
        }
    
    };
    
    class Observer :public iobserver
    {
        weak_ptr<isubject> subject;
    public:
    
        Observer( SubjectSptr subject)
        {
            this->subject = subject;
            subject->attach(static_cast<ObserverSPtr>(this));
            
        }
        void update()
        {
            cout << "Subject got updated to new state:" << subject.lock()->getState() << endl;
        }
    };

 

下面是驱动代码

    int main()
    {
        //observer
        /*
         1.subject
         2.observer
         
        
        */
    
        auto subject = make_shared<Subject>();
        auto observer1 = make_shared<Observer>(subject);
        auto observer2 = make_shared<Observer>(subject);
        auto observer3 = make_shared<Observer>(subject);
       
        subject->setState(2);
        
        
                return 0;
    }

当我们尝试将 observer3 与 subject 分离时发生崩溃。谁能帮我这个?如何使用智能指针高效实现观察者模式?

编辑:

已启用为主题分享此内容但仍然崩溃

class Subject :public isubject, public enable_shared_from_this<Subject>
{
    int state;
    ObserverList subscribed_observers;

public:

    shared_ptr<Subject> shared_this()
    {
        return shared_from_this();
    }
    Subject()
    {
        state = -1;
        subscribed_observers.clear();
    }
    void attach(ObserverSPtr observer)
    {
        subscribed_observers.push_back(observer);
    }

    void detach(ObserverSPtr observer)
    {
        subscribed_observers.remove(observer);
    }

    void notifyall()
    {
        for (auto &observer : subscribed_observers)
        {
            observer->update();
        }
    }

    int& getState()
    {
        return state;
    }

    void setState(int state)
    {
       this->state = state;
       this->notifyall();
    }

};
c++ c++11 design-patterns smart-pointers observer-pattern
© www.soinside.com 2019 - 2024. All rights reserved.