Как подходить к копированию объектов с помощью умных указателей в качестве атрибутов класса?

Отповысить документацию библиотеки Я прочитал это:

Концептуально умные указатели рассматриваются как владеющие указанным объектом и, таким образом, отвечающие за удаление объекта, когда он больше не нужен.

У меня очень простая проблема: я хочу использовать RAII для атрибутов указателя класса, который можно копировать и назначать.

Операции копирования и присваивания должны быть глубокими: каждый объект должен иметь свою собственную копию фактических данных. Кроме того, RTTI должен быть доступен для атрибутов (их тип также может быть определен во время выполнения).

Должен ли я искать реализацию копируемого интеллектуального указателя (данные небольшие, поэтому я нене нужноКопирование при записи указатели), или я должен делегировать операцию копирования конструкторам копирования моих объектов, как показано вэтот ответ?

Какой умный указатель выбрать для простого RAII класса, который можно копировать и назначать? (Я'Я думаю, что unique_ptr с делегированными операциями копирования / присваивания конструктору копирования класса и оператору присваивания сделает правильный выбор, но я не уверен)

Вот'спсевдокод для проблемы с использованием сырых указателей, это 'Это просто описание проблемы, а не работающий код C ++:

// 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;
}

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

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