В качестве продолжения к Классу, содержащему auto_ptr, хранящемуся в векторе , я полагаю, что неустановленный вывод состоит в том, что можно использовать классы с элементом auto_ptr
в качестве элементов контейнера, если конструкция копирования и назначение копирования определяются пользователем (чтобы не вызывать конструктор копирования auto_ptr
s и назначение копирования). что-нибудь в этом нарушает требования Стандартной библиотеки?
Пожалуйста, скажите мне, если что-то не так с этим, поскольку я хотел бы начать делать это идиоматически:
#include <memory>
#include <algorithm>
class Y { /* ... */ };
class Z : public Y { /* ... */ };
class X {
public:
X() : ap(new Z()) {}
X(const X& other) : ap(other.ap->clone()) {}
X& operator=(X other) { swap(other); return *this; } // any problem with swap?
void swap(X& other) { std::swap(ap, other.ap); }
// note no destructor necessary
private:
std::auto_ptr<Y> ap; // Y provides clone()
};
Обратите внимание, что я понял одну вещь: при таком подходе определение класса Y
должно находиться в области видимости для определения X
(в отличие от просто объявленного вперед, когда "необработанный" указатель на Y
используется). Это происходит потому, что когда создается экземпляр auto_ptr
, его деструктор должен вызвать delete для Y
, и поэтому Y
не может быть неполным типом. Я полагаю, что это должно быть сопоставлено со значением RAII в случае, если класс X
управлял несколькими ресурсами (имеет несколько auto_ptr
членов). Есть мысли по этому поводу?
Я думаю, что этот метод в целом хорош, чтобы исключить много хитрого кода для классов, которым, возможно, придется создать / уничтожить / скопировать потенциально несколько ресурсов (принципал единой ответственности). Мне просто интересно, служит ли auto_ptr
для этой цели или не работает здесь из-за какого-то тонкого языка / требований Стандартной библиотеки.
Обратите внимание, что мне известны другие типы интеллектуальных указателей, но я реализую интерфейс библиотеки и не хочу навязывать какие-либо требования для Boost или TR1 для моих клиентов. Любая лекция по использованию auto_ptr
в целом будет отклонена!