|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
||||||
Как перегружать функции с разным возвращаемым типом?26.06.2019, 18:54. Показов 4474. Ответов 20
Метки нет (Все метки)
Не могу найти в Help-е, как это сделать.
Например, мне нужно перегрузить функции возведения в квадрат:
0
|
||||||
| 26.06.2019, 18:54 | |
|
Ответы с готовыми решениями:
20
Шаблон функции с разным возвращаемым типом независимо управлять типом входных данных массива для определения сред. ариф. и возвращаемым значением функции Что не так с возвращаемым типом ? |
|
"C with Classes"
|
|||||||
| 26.06.2019, 19:06 | |||||||
Сообщение было отмечено Artem_Pv как решение
РешениеДобавлено через 4 минуты
возвращаемый тип не явно кастится стандартными правилами преобразования типа.
1
|
|||||||
|
Заблокирован
|
|
| 26.06.2019, 19:11 | |
|
return aNumber*aNumber;
0
|
|
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
|
| 26.06.2019, 20:03 [ТС] | |
|
_stanislav,
ага, это понял. Спасибо. Еще вопрос про перегрузку: Если в разных файлах есть функции с одинаковыми именами, то как компилятор определяет, какие из этих функций считать перегружаемыми, а какие просто случайно оказались одноименными(не планировались для перегрузки)? P.S. В других языках, чтоб не ошибиться, есть специальная директива “Overload”; а в С++ какие правила?
0
|
|
|
"C with Classes"
|
|||
| 26.06.2019, 20:14 | |||
|
Добавлено через 3 минуты
1
|
|||
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
||
| 26.06.2019, 20:19 [ТС] | ||
|
Т.е. все одноименные функции из разных файлов считаются перегружаемыми? Ведь это не серьезно..?
0
|
||
|
"C with Classes"
|
||
| 26.06.2019, 20:22 | ||
|
Добавлено через 30 секунд если сигнатура одинаковая вступает в силу правило одного определения. Добавлено через 24 секунды и компилятор ошибку выдаст.
1
|
||
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
|||||||
| 26.06.2019, 20:31 [ТС] | |||||||
0
|
|||||||
|
"C with Classes"
|
|||
| 26.06.2019, 20:37 | |||
|
Добавлено через 1 минуту Добавлено через 3 минуты но компилятор должен в принципе выдать сообщение о неоднозначном вызове, в этом конкретном случае.
1
|
|||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 26.06.2019, 20:38 | ||
|
1
|
||
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
||
| 26.06.2019, 20:53 [ТС] | ||
|
Предположим, обычная программа вызывает 100 функций, т.е. надо 100 раз указать пространство имен? Извиняюсь, за глупые вопросы(я 100% новичок в С++) В других языках программирования есть простая защита от “чужих” одноименных функций; Там можно не бояться, что одноименные “чужаки” будут вызваны только из-за того, что лучше совпала сигнатура. А в языке С++ есть простая защита от одноименных “чужаков” ? P.S. спасибо за Ваше терпение.
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 26.06.2019, 21:04 | |||
|
Добавлено через 8 минут Пространства имён - это не о том, это как делать функции с разными именами. Но это уже не переопределение, тупо другая функция, которую надо вызывать явно.
1
|
|||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 26.06.2019, 21:24 | ||
|
0
|
||
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
|||
| 26.06.2019, 21:25 [ТС] | |||
|
Это ведь несерьезно /В других языках, одноименные функции не являются угрозой, т.к. совпадение имени еще недостаточно, чтоб быть перегруженной, требуется спец.директива "overload". Подозреваю, что в С++ тоже присутствует защита... просто надо ее отыскать. и даже НЕ подозреваю, что может оказаться одноименный "чужак" , который без спросу влезет из-за совпавшей сигнатуры.
0
|
|||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||
| 26.06.2019, 21:33 | |||
|
Добавлено через 5 минут
1
|
|||
|
"C with Classes"
|
||
| 26.06.2019, 21:34 | ||
![]() опять же если не уверен, делай длинные названия, или всегда определяй свои функции в своем пространстве имен, либо у тебя всегда под рукой есть отладчик, который подскажет в какую функцию ты влез.
2
|
||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||||||
| 26.06.2019, 21:36 | ||||||
|
Artem_Pv,
1
|
||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||||||
| 26.06.2019, 23:30 | ||||||
Сообщение было отмечено Artem_Pv как решение
Решение
Artem_Pv, откровенно говоря, эта проблема действительно существует и редко, очень редко, но бывает, что портит много крови, особенно в огромных проектах.
Какой-то языковой защиты от этого нет, потому что это фича, а не баг. Пространства имен могут помочь, желательно следить за уникальностью имен с помощью них, или других средств, но не всегда это спасает. Например вот в такой ситуации то, что ваша функция находится в пространстве имен, не спасет:
К сожалению не все разработчики сознательные и поставляют свои библиотеки с заботой об уникальности имен. И тогда могут возникнуть подобные неприятные ситуации. Поэтому заботиться об этом нужно в первую очередь дисциплиной: \ Если вы хотите вызывать функцию именно из глобального пространства имен - пишите перед ней ::. Это поможет не спутать ее с одноименными в ваших классах или неймспейсах.\ Если у вас подозрение, что имя неуникально, то лучше позаботиться явном указании типов (как вам советовали выше), или явном указании пространства имен, где эта функция находится. \ И вообще, неявные преобразования опасны. Для того, чтобы исключить неявные преобразования есть набор инструментов, как языковых (explicit, brace initialization), так и стилистических (рекомендация не злоупотреблять пользовательскими операторами преобразования). \ Сюда же относится непонимаемый многими новичками практический запрет на использование using namespace std; именно затем он и запрещен, чтобы не плодить неуникальные сущности искусственно. В общем-то это справедливо не только для std, но и любого другого namespace. ___ На самом деле, даже если бы в С++ был явный механизм управления перегрузками, это не защитило бы от подобных ошибок. Допустим два независимых разработчка написали функцию print. У каждого из них по 2 перегрузки этой функции. Один написал их для char и int, другой для short и long. Естественно каждый разработчик пометил свои функции как перегруженные. Затем все четыре функции попали каким-то образом в один проект и программист этого проекта опять наткнулся на неочевидное поведение. Ничего не изменилось, хотя, казалось бы, все сделано правильно. ___ И все-таки, я хотел бы вас успокоить: за многолетнюю практику лично я встречался с таким о силы раза 3. Действительно тогда пришлось попотеть, чтобы понять в чем причина. Если же придерживаться рекомендаций по написанию программ, то шанс подобного сводится к очень маленькой вероятности. Со временем перестаешь обращать на это внимание, и <правильно> получается уже на автомате.
2
|
||||||
|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
||||||
| 27.06.2019, 09:48 [ТС] | ||||||
|
Спасибо всем, кто ответил.
Я понял, что нужно учиться дисциплине программирования в C++ для меня это пока новый непонятный мир. Вот мой пример:
Последняя надежда на автоматику. Отсюда Вопрос: А компилятор подскажет, что появились “опасные” одноименные функции? Добавлено через 8 минут P.S. даже боюсь представить, насколько в C++ д.б. "опасен" оператор with ... ?! А в других языках, оператор with не считается опасным.
0
|
||||||
|
"C with Classes"
|
|||
| 27.06.2019, 09:58 | |||
|
Если функции полностью идентичны, то любой компилятор это заметит и выдаст ошибку, если у функции одно имя но разные типы параметров (возвращаемый тип в счет не идет), компилятор посчитает ее перегруженной. Добавлено через 57 секунд
1
|
|||
| 27.06.2019, 09:58 | |
|
Помогаю со студенческими работами здесь
20
Событие с возвращаемым типом моего класса Дочерний класс со своим методом и возвращаемым типом Как сделать вектор/массив объектов одного класса с разным <типом>
Функция с разным типом возвращаемых данных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как дизайн сайта влияет на конверсию: 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-код на мобильном. Вращайте камеру одним пальцем,. . .
|
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|