В нашем коде мы в основном используем необработанные указатели, и я бы хотел шаг за шагом вводить умные указатели (т.е. без изменения существующих функций).У нас есть фабрика, которая возвращает указатель на созданный объект.Несколько методов в классе используют этот объект, поэтому указатель на созданный объект объявлен как член класса.
std::unique_ptr<IObject> object;
Теперь я хотел бы заменить необработанный указатель умным указателем.
Я обнаружил, что могу передать необработанный указатель в конструктор умного указателя (в моем случае я думаю, что unique_ptr правильный), но поскольку умный указатель объявлен в заголовке, это не работает.Я попытался использовать
object = make_unique<IObject>(CreateObject(1));
, но это дает ошибку компиляции, потому что IObject является абстрактным.Единственное решение, которое я смог найти, - это создать временный unique_ptr и затем использовать move.
//Factory.h
std::unique_ptr<IObject> object;
//Factory.cpp
IObject* ObjectFactory::CreateObject(int type)
{
switch( type )
{
case 1:
return new A();
case 2:
return new B();
}
}
//My solution is:
object = std::move( std::unique_ptr<IObject>(ObjectFactory::CreateObject(1)) );
Мне было интересно, есть ли лучший способ, чем создать временный умный указатель и затем использовать move для передачи права собственности.