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