Re[2]: Доступ к copy-ctor через отдельный метод
От: _hum_ Беларусь  
Дата: 24.03.22 15:22
Оценка:
Здравствуйте, Igore, Вы писали:

I>Здравствуйте, _hum_, Вы писали:


__>>Появилась задача добавить уже существующему классу возможность клонирования его объектов (изначально такой возможности не было — копирование было запрещено). Поскольку класс довольно массивный, то есть опасения, что при написании конструкторов копирования будут ошибки. По этой причине, не хотелось бы открывать эти конструкторы копирования для полного доступа, тем самым открывая возможность их неявного вызова в коде. Хотелось бы, чтобы вызовы конструкторов были только для задачи клонирования, и соответственно, осуществлялись явно. На ум тут пришло следующее решение:

__>>
__>>class CA
__>>{
__>>    std::unique_ptr<int> m_ui;
__>>    //^^^^^^^^^^^^^^^^^^^^^^^
__>>    explicit 
__>>    CA(const CA& o)
__>>        :m_ui(new int(*o.m_ui))
__>>    {}
__>>    //-----------------------
__>>public:
__>>    //-----------------------
__>>    CA(int i):
__>>      m_ui(new int(i))
__>>    {}
__>>    //-----------------------
__>>    CA(CA&&)=default;
__>>    //-----------------------
__>>    CA clone(){ return CA(*this);}
__>>    //-----------------------
__>>    int get(){return *m_ui;}
__>>    //-----------------------
__>>};

__>>

__>>Но насколько оно соответствует заявленной цели,
I>По виду не соответсвует, clone != move, у тебя после такого clone сам объект теряет владение над m_ui

ммм... я же копию создаю и ее перемещаю, а не исходный объект. Потому ничего он, вроде, не теряет.

__>>и может, есть что-нибудь красивее?

I>Ну, сама идея вроде правильная, пишем operator = в private и в public clone используем, придется да акуратно написать копирование, других вариантов в голову не приходит
__>>(И, на всякий случай, есть ограничения — в функции clone нельзя использовать работу с динамической памятью).
I>С таким ограничением непонятно как это сделать, если только переопределять new и использовать заранее выделеную память

может, как-то можно в clone передавать какой-нибудь пользовательский constructor-allocator, чтоб с его помощью создавать объект и возвращать указатель (чтобы можно было и конструктор перемещения закрыть в private)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.