unique_ptr и полиморфизм
У меня есть код, который в настоящее время использует сырые указатели, и я хочу перейти на умные указатели. Это помогает очистить код различными способами. Во всяком случае, у меня есть фабричные методы, которые возвращают объекты и вызывающийответственность за управление ими. Собственность нет поделились и поэтому я понимаюunique_ptr
подойдет. Все объекты, которые я возвращаю, обычно являются производными от одного базового класса.Object
Например,
class Object { ... };
class Number : public Object { ... };
class String : public Object { ... };
std::unique_ptr State::NewNumber(double value)
{
return std::unique_ptr(new Number(this, value));
}
std::unique_ptr State::NewString(const char* value)
{
return std::unique_ptr(new String(this, value));
}
Возвращаемые объекты довольно часто необходимо передавать другой функции, которая работает с объектами типаObject
(базовый класс). Без каких-либо умных указателей код такой.
void Push(const Object* object) { ... } // push simply pushes the value contained by object onto a stack, which makes a copy of the value
Number* number = NewNumber(5);
Push(number);
При преобразовании этого кода для использования I 'unique_ptrs
мы столкнулись с проблемами с полиморфизмом. Изначально я решил просто изменить определениеPush
использоватьunique_ptrs
тоже, но это генерирует ошибки компиляции при попытке использовать производные типы. Я мог бы выделить объекты в качестве базового типа, как
std::unique_ptr number = NewNumber(5);
и передать ихPush
- что, конечно, работает. Однако мне часто нужно вызывать методы для производного типа. В итоге я решил сделатьPush
работать с указателем на объект, хранящийся в.unique_ptr
void Push(const Object* object) { ... }
std::unique_ptr number = NewNumber(5);
Push(number.get());
Теперь о причине публикации. Я'я хочу знать, является ли это нормальным способом решения проблемы, с которой я столкнулся? Это лучше иметьPush
работать наunique_ptr
против самого объекта? Если так, то как можно решить проблемы полиморфизма? Я бы предположил, что простое приведениет работа. Часто ли требуется получить базовый указатель от умного указателя?
Спасибо, извините, если вопрос нене ясно (просто дайте мне знать).
редактировать: я думаю, что моя функция Push была немного неоднозначной. Создает копию базового значения и нефактически не изменяет и не сохраняет входной объект. "