Я узнал, что unique_ptr может указывать на уже существующий объект. Например, я могу это сделать:Сильное динамическое распределение Си ++ с уникальным_ptr?
class Foo {
public:
Foo(int nb) : nb_(nb) {}
private:
int nb_;
};
int main() {
Foo f1(2);
Foo* ptr1(&f1);
unique_ptr<Foo> s_ptr1(&f1);
return 0;
}
Мой вопрос:
Если я создаю класс с unique_ptr < Bar>, как члены данных (где Bar является класс, где был удален конструктор копирования) и конструктор, который принимает указатели в качестве аргумента, могу ли я запретить пользователю передавать уже существующий объект/переменную в качестве аргумента (в этом конструкторе) (то есть заставить его использовать новое ключевое слово)? Потому что, если он это сделает, я не смогу гарантировать состояние valide моих объектов класса (пользователь все еще может изменять элементы данных с их адресом извне класса) .. и я не могу скопировать содержимое Бар в другую область памяти. не
Пример:
class Bar {
public:
Bar(/* arguments */) { /* data members allocation */ }
Bar(Bar const& b) = delete;
/* Other member functions */
private:
/* data members */
};
class Bar_Ptr {
public:
Bar_Ptr(Bar* ptr) {
if (ptr != nullptr) { ptr_ = unique_ptr<Bar> (ptr); }
} /* The user can still pass the address of an already existing Bar ... */
/* Other member functions */
private:
unique_ptr<Bar> ptr_;
};
«Но я не смог бы сделать это с помощью shared_ptr. *« ... почему бы и нет? Насколько я знаю, конструкторы 'shared_ptr' не имеют никакой защиты от этого. –
"* и я не могу скопировать содержимое Bar в другую область памяти *« Можете ли вы действительно сделать это в любом случае? 'unique_ptr' не копируется. –
О да, вы правы в первую очередь. Раньше я запускал небольшой тестовый файл, и он не компилировался. Должно быть, было что-то еще. Во-вторых, я подумал о том, чтобы взять объект в качестве аргумента и просто объявить unique_ptr, указывающий на динамически выделенную память (которая будет содержать копию Bar) внутри конструктора, но это невозможно, если конструктор копирования удален. – Desura