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

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


__>>>>[/ccode]

__>>>>Но насколько оно соответствует заявленной цели,
I>>>По виду не соответсвует, clone != move, у тебя после такого clone сам объект теряет владение над m_ui
__>>ммм... я же копию создаю и ее перемещаю, а не исходный объект. Потому ничего он, вроде, не теряет.
I>Да, всё верно, я чего то под вечер подумал что CA(CA&&)=default; будет вызываться

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

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

ну, хотелось бы полностью запретить неявные вызовы всех конструкторов, включая конструкторы перемещения.

I>либо заранее создать пул объектов выдергивать объект из пула клонировать значения полей, когда он не нужен возвращать в пул

I>
I>void clone(CA& toClone){ 
I>   toClone.set( get() );
I>}
I>

здесь нет создания копии — ваш set предполагает переинициализацию уже созданного. Не всегда такое возможно сделать (например, если класс содержит константное свойство, поменять его с помощью set уже нормально не выйдет)

I>Откуда ограничение что "clone нельзя использовать работу с динамической памятью"?


дело в том, что код состоит из двух частей — первая предназначена для работы на микроконтроллере без динамической памяти, вторая же идет как обвязка для воспроизведения симуляции работы контроллера на ПК. Так вот не хотелось бы эти части смешивать — вносить в первую часть кода все, что связано с динамической памятью.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.