|
23 / 23 / 4
Регистрация: 08.04.2013
Сообщений: 150
|
||||||
Странная запись при передаче флагов как параметров в функцию06.08.2015, 10:55. Показов 2404. Ответов 13
Метки нет (Все метки)
Здравствуйте.
Возникла необходимость использования функции StringReplace в коде и я обнаружил, что флаги в качестве аргументов в ней передаются следующим образом: TReplaceFlags() << rfReplaceAll << rfIgnoreCase. Т.е. в коде это выглядит так:
Что означает такая запись?
0
|
||||||
| 06.08.2015, 10:55 | |
|
Ответы с готовыми решениями:
13
Одинаково ли быстродействие: 1. при передаче параметров в функцию или 2. создание кортежа и передаче его в функцию? Не понятный баг при передаче параметров в функцию При передаче ссылки на массив в функцию перестает работать запись |
|
Супер-модератор
|
|
| 06.08.2015, 11:29 | |
Сообщение было отмечено Kirill R как решение
Решение
Она означает, что в С++ нет типа "множество", оно лишь имитируется, и для удобства перегружены операторы << (для добавления элемента во "множество") и >> (для удаления элемента из "множества"). То есть, запись, фактически, означает:
"Создать экземпляр класса TReplaceFlags и внести в него элементы rfReplaceAll и rfIgnoreCase"
1
|
|
|
23 / 23 / 4
Регистрация: 08.04.2013
Сообщений: 150
|
|
| 06.08.2015, 11:39 [ТС] | |
|
Но ведь это можно было сделать списком, либо массивом, либо просто сделать переменным число аргументов. Не знаете, почему был выбран именно такой вариант?
На мой взгляд, создание отдельного класса и перегрузка операторов - нетривиальная задача...
0
|
|
|
Супер-модератор
|
||
| 06.08.2015, 11:48 | ||
|
Для пользователя удобнее именно такой вариант, если было бы массивом - пришлось бы описывать массив отдельно, и потом его передавать в функцию. Аналогично и со списком. А подобная перегрузка (ее не нужно делать, она уже сделана разработчиками, так что тривиальна или нет сама перегрузка - неважно, важно, что тривиально ее использование) позволяет прямо в нудном месте создать класс, и заполнить его нужными значениями, без необходимости выносить заполнение в отдельную строку текста программы.
Добавлено через 1 минуту TReplaceFlags() << rfIgnoreCase << rfReplaceAll ? Мне что, переучиваться?
1
|
||
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
||||||
| 06.08.2015, 11:59 | ||||||
Сообщение было отмечено Kirill R как решение
Решение
StringReplace требует четвертым параметром объект типа TReplaceFlags. Чтобы не создавать отдельно этот объект, запись ужимается вот до такого вида, что ухудшает понимание. TReplaceFlags() - со скобочками - это вызов конструктора объекта. То есть такой записью в четвертом параметре StringReplace создается безымянный объект соответствующего типа, в который, посредством перегруженного оператора <<, передаются значения, флаги, какие следует установить. Полученный таким образом временный безымянный объект типа TReplaceFlags будет уничтожен по выходу из функции замены символа.
Все это можно было б нагляднее записать вот так:
1
|
||||||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
||
| 06.08.2015, 12:09 | ||
|
1
|
||
|
Супер-модератор
|
||
| 06.08.2015, 12:10 | ||
|
1
|
||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 06.08.2015, 12:32 | |
|
volvo, Сомневаюсь, что решающим фактором для представления делфийского множества в виде класса Set, а не какого-нибудь массива, было исключительно удобство. Если бы даже массивом было удобнее, то через него нельзя было бы передавать этот параметр, потому что функция StringReplace ожидает множество, а ставить для C++ знак тождества между делфийскими массивом и множеством - это не очень хорошо. Сама реализация неплохая, разве что можно было бы это все сопроводить каким-нибудь синтаксическим сахаром, которого в билдере хватает, но сотрудники Борланда решили этого не делать.
1
|
|
|
23 / 23 / 4
Регистрация: 08.04.2013
Сообщений: 150
|
|
| 06.08.2015, 13:45 [ТС] | |
|
0
|
|
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 06.08.2015, 14:03 | |
|
Kirill R, допустим, свойства. В C++ их нет, в Delphi есть, и в C++ Builder'е они тоже есть, чтобы обеспечить совместимость с классами VCL, реализованных в Object Pascal'е.
0
|
|
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 06.08.2015, 14:24 | |
|
volvo, это был ответ на то, что я подразумеваю под синтаксическим сахаром. К StringReplace отношения не имеет.
0
|
|
|
Супер-модератор
|
|
| 06.08.2015, 14:39 | |
|
В таком случае зачем говорить о синтаксическом сахаре, если он вообще не имеет отношения к обсуждаемому вопросу? Я еще раз повторяю, что именно удобство для пользователя было основным фактором выбора перегрузки операций для работы с псевдомножествами. Там выше было возражение, что можно было бы это все сопроводить каким-либо синтаксическим сахаром. Оказывается, разговор был вообще ни о чем? К чему тогда сотрясать воздух непонятными высказываниями? Чтобы только опровергнуть чужое мнение? Только в моем случае это не проходит. Я не первый год вижу вот таких "опровергателей", и прекрасно изучил их повадки.
По делу есть что сказать? Какой еще "сахар" может позволить более удобно работать с аналогом множеств в С++? Конкретные примеры вызовов, пожалуйста, приводите, а не просто размышления "если бы вот сюда прилепить вот эту фигню, и если еще этот самолет взлетит - то было бы круто"...
0
|
|
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 06.08.2015, 15:27 | |
|
volvo, то есть, вы хотите сказать, что, во-первых, в C++ Builder множества реализованы удобнее, чем в Dephi, так как в C++ Builder используется перегрузка операторов, а в Delphi нет? А, во-вторых, если бы в C++ можно было бы записывать массив, как в C# (TReplaceFlag[]{rfReplaceAll, rfIgnoreCase}), то в Борланде не стали бы городить свой класс на замену множеств, а использовали бы для этих целей массивы?
0
|
|
| 06.08.2015, 15:27 | |
|
Помогаю со студенческими работами здесь
14
Ошибка при передаче параметров в функцию. Объясните, ребят, пожалуйста, в чем ошибка Как наиболее правильно (или корректно) должна выглядеть строка запроса при передаче в скрипт параметров?
Странное поведение при передаче параметров Ошибка при передаче параметров в подпрограмму Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|