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