|
|
|||||||||||
Конструктор копирования и оператор присваивания - общая часть, выделять ли в отдельный метод20.04.2017, 04:56. Показов 2071. Ответов 14
Метки нет (Все метки)
Как лучше?
1
2
Выделять ли общую часть в отдельный метод?
0
|
|||||||||||
| 20.04.2017, 04:56 | |
|
Ответы с готовыми решениями:
14
Конструктор копирования и оператор присваивания
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 20.04.2017, 04:59 | |||
|
Добавлено через 51 секунду знак подчеркивания в начале имени - признак UB.
0
|
|||
|
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
|
| 20.04.2017, 05:45 | |
|
0
|
|
|
Любитель чаепитий
|
||
| 20.04.2017, 05:48 | ||
|
но про UB там ни слова. hoggy, объясните, пожалуйста, почему это UB?
2
|
||
|
Вездепух
12935 / 6802 / 1821
Регистрация: 18.10.2014
Сообщений: 17,214
|
|||||||
| 20.04.2017, 05:54 | |||||||
init может оказаться лишней. А вот последовательность swap можно, при желании, выделить в отдельный метод или, даже лучше, friend-функцию.Почему ваш оператор присваивания возвращает по значению - не знаю...
1
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 20.04.2017, 05:58 | |
|
1
|
|
|
|
|||
| 20.04.2017, 06:22 [ТС] | |||
|
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 20.04.2017, 07:53 | |||
|
и когда стандарт говорит: вы не должны использовать идентификаторы:
то такой ваш код уже попадает под определение UB.
2
|
|||
| 20.04.2017, 07:56 | |
|
Не по теме: hoggy, а вот интересно, может быть такое, что из-за этого будет ошибка времени выполнения, а не компиляции?
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 20.04.2017, 08:07 | |||||||
|
http://rextester.com/ZELN59951
как глобальный идентификатор запросто перекрыл мембер. соответственно, в рантайме получили не то, что ожидали. а вообще - ну фик его знает, какая может выстрелить ситуация.
3
|
|||||||
|
Вездепух
12935 / 6802 / 1821
Регистрация: 18.10.2014
Сообщений: 17,214
|
|||
| 20.04.2017, 08:50 | |||
Сообщение было отмечено GoldenId как решение
Решение*this содержат старые значения, которые надо не забыть освободить. А именно - массивы _int и _frac. А rhs содержит новые значения. Если мы просто сделаем "почленное присваивание", то старые значения превратятся в утечки памяти.Поэтому мы именно обмениваем старые с новыми через swap. Т.е. старые значения попадают в rhs. В конце работы оператора rhs будет автоматически уничтожен, а вместе с ним уничтожатся и старые значения. Разумеется, эти рассуждения относятся только к полям-указателям на дополнительные ресурсы, т.е. _int и _frac. Остальные поля можно просто присваивать. Но чисто ради единообразия обычно делают swap для всех полей.Таким образом в рамках идиомы copy-and-swap как конструктор копирования, так и деструктор Fraction работают как методы, в которые вынесен повторяющийся код: код выделения-копирования новых значений и код освобождения старых значений соответственно. (Вы почему-то не обратили внимания на то, что у вас повторяется не только и код копирования, но код освобождения.) Идиома copy-and-swap устраняет повторения и того и другого без введения новых функций.P.S. Отдельной прелестью такого подхода является то, что последовательность swap является операцией, безопасной с точки зрения исключений - она не выбрасывает исключений вообще. Таким образом, если где-то в процессе копирования произошло исключение, то гарантируется, что независимо от того, где оно произошло, объект-получатель либо станет корректной копией оригинала, либо вообще останется нетронутым. Невозможна ситуация, когда объект-получатель получит лишь частичную копию оригинала.
1
|
|||
|
|
||||||||||||||||
| 20.04.2017, 11:21 [ТС] | ||||||||||||||||
|
Создание дополнительного экземпляра Fraction? Что с оверхедом в строке
// повторное использование кодаКликните здесь для просмотра всего текста
swap не просто получает нам новые значения в lvalue-объект, но и отправляет старые на утилизацию...Кликните здесь для просмотра всего текста
0
|
||||||||||||||||
|
|
||||||||
| 20.04.2017, 20:21 [ТС] | ||||||||
|
Вот так
Добавлено через 7 часов 46 минут TheCalligrapher, спасает ли copy-and-swap от самоприсваивания? ... Вроде да. stackoverflow говорит:
std::swap использовать нельзя, если члены-данные сами страдают от нереализованной copy-and-swap идиомы, но в моё случае простых типов и оригинальных указателей можно?
0
|
||||||||
|
|
|
| 23.04.2017, 06:22 [ТС] | |
|
hoggy, GbaLog-, TheCalligrapher. Назрел ещё один вопрос по проектированию. Прошу помочь увязать создание объектов этих длинных чисел, изменение их разрядности, инициализацию значений, сдвиг и рекомендованную здесь идиому.
0
|
|
| 23.04.2017, 06:22 | |
|
Помогаю со студенческими работами здесь
15
Про конструктор копирования, оператор присваивания Очередь, конструктор копирования и перегруженный оператор присваивания Ребят, уже запарился, гляньте, что не так!? конструктор копирования и оператор присваивания
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|