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 была немного неоднозначной. Создает копию базового значения и нефактически не изменяет и не сохраняет входной объект. "

Ответы на вопрос(4)

Ваш ответ на вопрос