Из увеличить библиотечную документацию Я прочитал следующее:
Концептуально, умные указатели рассматриваются как владеющие объектом, на который указывают, и, таким образом, ответственный за удаление объекта, когда он больше не необходимо.
У меня очень простая проблема: я хочу использовать RAII для атрибутов указателя класса, который можно скопировать и присваивать.
Операции копирования и присваивания должны быть глубокими: каждый объект должен иметь свою собственную копию фактических данных. Кроме того, RTTI должен быть доступен для атрибутов (их тип также может быть определен во время выполнения).
Должен ли я искать реализацию умного указателя с возможностью копирования (данные небольшие, поэтому мне не нужно Копировать на запись указатели), или я передаю операцию копирования конструкторам копий моих объектов, как показано в этом ответе?
Какой смарт-указатель я могу выбрать для простого RAII класса, который можно копировать и присваивать? (Я думаю, что unique_ptr с делегированными операциями копирования/присваивания конструктору экземпляра класса и оператору присваивания сделал бы правильный выбор, но я не уверен)
Здесь псевдокод для проблемы с использованием raw-указателей, это просто описание проблемы, а не код С++:
// Operation interface
class ModelOperation
{
    public: 
        virtual void operate = (); 
};
// Implementation of an operation called Special 
class SpecialModelOperation
:
    public ModelOperation
{
    private:
        // Private attributes are present here in a real implementation. 
    public: 
        // Implement operation
        void operate () {}; 
};
// All operations conform to ModelOperation interface
// These are possible operation names: 
// class MoreSpecialOperation; 
// class DifferentOperation; 
// Concrete model with different operations
class MyModel 
{
    private: 
        ModelOperation* firstOperation_; 
        ModelOperation* secondOperation_;  
    public:
        MyModel()
            : 
                firstOperation_(0), 
                secondOperation_(0)
        {
            // Forgetting about run-time type definition from input files here.
            firstOperation_  = new MoreSpecialOperation(); 
            secondOperation_ = new DifferentOperation(); 
        }
        void operate()
        {
            firstOperation_->operate(); 
            secondOperation_->operate();
        }
        ~MyModel() 
        {
            delete firstOperation_; 
            firstOperation_ = 0; 
            delete secondOperation_; 
            secondOperation_ = 0; 
        }
};
int main()
{
    MyModel modelOne; 
    // Some internal scope
    {
        // I want modelTwo to have its own set of copied, not referenced 
        // operations, and at the same time I need RAII to for the operations, 
        // deleting them automatically as soon as it goes out of scope. 
        // This saves me from writing destructors for different concrete models.  
        MyModel modelTwo (modelOne); 
    }
    return 0;
}
