как использовать weak_ptr в качестве параметра?

#c #observable #smart-pointers

#c #наблюдаемый #интеллектуальные указатели

Вопрос:

 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), как я узнаю, что «этот» объект находится в стеке или куче???

Комментарии:

1. Если Observer находится в стеке, то как Observable удалось получить weak_ptr доступ к нему?

2. Смотрите также: std::enable_shared_from_this