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”对象在堆栈中还是在堆中?