enable_shared_from_this
针对上次的问题,this指针的暴露依照前面的解法应该用shared_ptr来解决,但get()本身是个成员函数,如何获得一个指向当前对象的shared_ptr<StockFactory>对象呢?
可以使用enable_shared_from_this。这是一个以其派生类为模板类型实参的基类模板,继承它,this指针就能变身为shared_ptr。
class StockFactory:public boost::enable_shared_from_this<StockFactory>,boost::noncopyable
{};
为了使用shared_from_this(),StockFactory不能时stack object,必须是heap object且由shared_ptr管理其生命期,即
shared_ptr<StockFactory> stockFactory(new StockFactory);
然后就可以把this换为shared_from_this()了。
shared_ptr<Stock> StockFactory::get(const string& key)
{
shared_ptr<Stock> pStock;
MutexLockGuard lock(mutex);
weak_ptr<Stock>& wkStock = stocks[key];
pStock = wkStock.lock();
if(!pStock)
{
pStock.reset(new Stock(key),boost::bind(&StockFactory::deleteStock,shared_from_this(),l));
wkStock = pStock;
}
return pStock;
}
这其中,shared_from_this()不能在构造函数里调用,因为它是在new完后才交给shared_ptr接管它的。最后一个问题,StockFactory的生命期被延长了。