2016-07-27 4 views
0

Как я понимаю, если у меня есть класс с переменной member :: scoped_ptr, и если бы я должен был копировать экземпляр этого класса и хотел бы, чтобы новый экземпляр имел свой член scoped_ptr, он указывал на копию того, что первый экземпляр указал, я должен был бы реализовать собственный конструктор копирования (и оператор присваивания) и сделать глубокое копирование явно всех точек scoped_ptr. Было бы замечательно, если бы у умного типа указателя был конструктор копирования, который сделал это сам.Есть ли облагороженный ptr, который имеет встроенные функции глубокой копии?

Нет ли подобных умных указателей в библиотеках C++ boost/stl, которые уже имеют встроенные функции глубокой копии, так что, когда копия умного указателя копируется, объект, на который он указывает, также копируется? По крайней мере, как вариант?

(Если бы был такой указатель, в моем случае указатель должен был знать немного больше о том, как он должен создать новый объект, поскольку мои объекты, на которые указывают объекты, являются полиморфными классами, с виртуальными функциями Clone(). умный указатель не мог неявно выяснить, как сделать глубокую копию, клиентский код мог бы поставить указатель на функцию или что-то, указывающее на функцию Clone, или любую функцию создания фабрики. Я предполагаю, что это осложнение того, как новый объект мог бы быть создан это может быть одной из причин, по которым у всех указателей нет функции глубокой копии ...?)

+0

Содержимое 'std :: unique_ptr' не копируется, а просто передается среди владельцев. –

+1

Да. Этого я не хочу. –

+0

Не используйте указатели, а также предоставляйте функцию 'clone()' для ваших классов. –

ответ

2

Насколько я знаю, никакая интеллектуальная указатель в стандартной библиотеке не реализует семантику, которую вы хотите.

Однако библиотека MNMLSTC core предоставляет, среди прочего, два умных указателя (а именно core::poly_ptr и core::deep_ptr), которые должны соответствовать вашему прецеденту. В частности, из-за наличия виртуальных функций-членов, я считаю, что core::poly_ptr - это то, что вам нужно.

+0

Выглядит хорошо. Я никогда раньше не использовал эту библиотеку. Попробует. –

Смежные вопросы