A shared_ptr<T>
моделирует указатель на T
, shared_ptr<T *>
моделирует указатель на T
.
Предполагая, что CEngineLayer
является IEngineLayer
, вы можете изменить свой код на:
shared_ptr<IEngineLayer> createEngineLayer()
{
try
{
return shared_ptr<IEngineLayer>(new CEngineLayer);
}
catch(const std::bad_alloc&)
{
// Unable to allocate enough memory for the engine layer.
return shared_ptr<IEngineLayer>();
}
}
Также обратите внимание, что преобразование «производное в базовое» не требует явного преобразования: если CEngineLayer
публично наследует от IEngineLayer
, указатель на CEngineLayer
может быть неявно преобразован в указатель на IEngineLayer
.
Также, как примечание, будет shared_ptr
уничтожить как интерфейс, так и
CEngineLayer, когда никто не использует его
больше?
Существует один объект с типом CEngineLayer
, который, если деструктор в IEngineLayer
является виртуальным (и должен быть), будет корректно уничтожен, когда счетчик ссылок достигнет 0.