как использовать слабый_птр в качестве параметра? - PullRequest
0 голосов
/ 23 апреля 2019
class Observable
{
public:
    void register(weak_ptr<Observer> x);
    void unregister(weak_ptr<Observer> x);
    void notify()
    {
        lock_guard lg(mutex_);
        for (auto it = observers_.begin(); it != observers_.end(); )
        {
            shared_ptr<Observer> pObserver(it->lock());
            if (pObserver)
            {
                pObserver->update();
                ++it;
            }
            else
            {
                it = observers_.erase(it);
            }
        }
    }
private:
    list<weak_ptr<Observer> > observers_;
    mutable mutex mutex_;
};

class Observer
{
public:
    void update();
    void oberver(weak_ptr<Observable> x)
    {
        shared_ptr<Observable> pObservable(x.lock());
        if (pObservable)
        {
            subject_ = pObservable;
        }
    }
    ~Observer()
    {
        shared_ptr<Observable> pObservable(subject_.lock());
        if (pObservable)
        {
                        //how to trans 'this' pointer to unregister?
            pObservable->unregister(...);
        }
    }
private:
    weak_ptr<Observable> subject_;
};

Посмотрите, деструктор Обозревателя должен вызвать unregister для удаления из Observable, но как я могу передать указатель this в качестве параметра, тип которого является weak_ptr.

я знаю, что мы можем использовать shared_ptr только для создания weak_ptr, но я беспокоюсь об этом: если я использую share_ptr pObserver (this), откуда мне знать, что этот объект находится в стеке или куче ???

...