Как подходить к копированию объектов с помощью умных указателей в качестве атрибутов класса?
Отповысить документацию библиотеки Я прочитал это:
Концептуально умные указатели рассматриваются как владеющие указанным объектом и, таким образом, отвечающие за удаление объекта, когда он больше не нужен.
У меня очень простая проблема: я хочу использовать 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;
}