Здравствуйте, 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 нельзя использовать работу с динамической памятью"?
дело в том, что код состоит из двух частей — первая предназначена для работы на микроконтроллере без динамической памяти, вторая же идет как обвязка для воспроизведения симуляции работы контроллера на ПК. Так вот не хотелось бы эти части смешивать — вносить в первую часть кода все, что связано с динамической памятью.