如何使用weak_ptr作为参数?

时间:2019-04-23 03:03:13

标签: c++ observable smart-pointers

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),我如何知道“ this”对象在堆栈中还是在堆中?

0 个答案:

没有答案