Форум программистов, компьютерный форум CyberForum.ru

Перегрузка функций. Значение по умолчанию - C++

Восстановить пароль Регистрация
 
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 82
19.07.2015, 18:09     Перегрузка функций. Значение по умолчанию #1
Добрый вечер.
Прощу помочь разобраться с вопросом.
Проблема в следующем. Есть класс, в нем есть перегруженная функция с разным количеством аргументов, когда присваиваю второму аргументу значение по умолчанию, пишет ошибку.
call of overloaded 'setText(QString&)' is ambiguous

Например:

.h файл.
C++
1
2
3
4
5
6
7
class text
{
...
void setText(const QString &newText);
void setText(const QString &Text, int x=15);
...
}
.cpp файл
C++
1
2
3
4
5
6
7
8
9
...
void setText(const QString &newText)
{
...
}
void setText(const QString &Text, int x)
{
...
}
main.cpp
C++
1
2
3
4
5
int main()
{...
text a;
a.setText("Hello");
...}
Когда в .h файле инициализирую аргумент x, выдает ошибку, когда в .cpp файле инициализирую, все нормально. Но ведь должна быть инициализация в .h файле. Почему так ?
Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
19.07.2015, 18:25     Перегрузка функций. Значение по умолчанию #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Это же очевидно: вызов происходит в main.cpp, там же и происходит выбор перегрузки. А main.cpp знает только то, что упомянуто в .h-файле. Поэтому если там имеется неоднозначность (а она имеется, если у x предоставить значение по умолчанию, а функцию вызывать только с одним аргументом), и возникает ошибка.
Поскольку в .cpp-файле функции setText есть, а их вызова нет, в нём ошибок не возникает.
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 82
19.07.2015, 18:28  [ТС]     Перегрузка функций. Значение по умолчанию #3
Так а по правилам же инициализацию нужно проводить в .h файлах, разве нет??
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
19.07.2015, 18:30     Перегрузка функций. Значение по умолчанию #4
Дело не в правилах, дело в здравом смысле. Значения по умолчанию подставляются в месте вызова, так что из места вызова должно быть видно объявление, в котором это дело описано. А оно находится в .h-файле.
Ну и естественно, что при необязательном втором параметре невозможно понять, какая из двух функций вызывается (первый-то аргумент совпадает). Там действительно неоднозначность, о чём и сообщает компилятор.
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 82
19.07.2015, 18:36  [ТС]     Перегрузка функций. Значение по умолчанию #5
Получает инициализацию аргумента по умолчанию следует проводить в .cpp файле? А в .h файле просто объявлять аргументы функции, без инициализации? Так правильно будет?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.07.2015, 18:45     Перегрузка функций. Значение по умолчанию #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Nick Alte Посмотреть сообщение
Значения по умолчанию подставляются в месте вызова
Как-то странно звучит. А какие значения подставляются не в месте вызова?
Цитата Сообщение от TheThe Посмотреть сообщение
Так правильно будет?
Правильно будет не допускать ситуаций, когда сигнатуры функций могут совпадать из-за наличия аргументов со значением по умолчанию. Т.е. в твоем случае стоило бы вообще выпилить функцию с одним аргументом.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
19.07.2015, 18:48     Перегрузка функций. Значение по умолчанию #7
В .cpp файле такая "инициализация"никому не нужна и не будет использоваться, ведь вызовов-то в этом .cpp нет.
Правильно будет так подобрать типы аргументов обеих перегрузок, чтобы неоднозначности не возникало.

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
А какие значения подставляются не в месте вызова?
Если речь об аргументах функции, то никакие. Однако же у меня сложилось впечатление, что ТС не вполне чётко осознаёт это и считает, что значение по умолчанию может подставляться в самой вызываемой функции (что, кстати, происходит в некоторых других языках).
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 82
19.07.2015, 18:53  [ТС]     Перегрузка функций. Значение по умолчанию #8
Всем спасибо, решил вообще убрать значение по умолчанию.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.07.2015, 18:59     Перегрузка функций. Значение по умолчанию #9

Не по теме:

Цитата Сообщение от Nick Alte Посмотреть сообщение
происходит в некоторых других языках
Пример можно?


На счет плюсОв популярен ещё пример параметров по умолчанию с виртуальными функциями:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
struct B
{
    virtual void f(int i = 42) { std::cout << "B" << i << std::endl; }
};
 
struct D : B
{
    virtual void f(int i = 100500) { std::cout << "D" << i << std::endl; }
};
 
int main() {
    B* b = new D;
    b->f(); 
}
Неожиданность результата новичков заставляет задуматься.
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 82
19.07.2015, 19:01  [ТС]     Перегрузка функций. Значение по умолчанию #10
Цитата Сообщение от Tulosba Посмотреть сообщение
Неожиданность результата новичков заставляет задуматься.
А правда, почему D42 получилось?)))
Nick Alte
19.07.2015, 19:02
  #11

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Пример можно?
Код
--Lua
function example(param)
    print("Parameter is ", param or "-none-")
end

Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.07.2015, 19:11     Перегрузка функций. Значение по умолчанию #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
TheThe, Параметры по умолчанию подставляются в момент компиляции, а выбор функции - в момент выполнения. Компилятор видит вызов на указателе на B и подставляет 42. При выполнении же выбирается функция из класса D, но параметр уже зафиксирован во время компиляции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2015, 19:16     Перегрузка функций. Значение по умолчанию
Еще ссылки по теме:

C++ Перегрузка функций
C++ Перегрузка функций: определите функцию, которая находит минимальное значение из двух чисел
Ошибка при перегрузка конструктора. Родительский объект инициализирует поле по умолчанию C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 82
19.07.2015, 19:16  [ТС]     Перегрузка функций. Значение по умолчанию #13
Любопытно, спасибо Вам.
Yandex
Объявления
19.07.2015, 19:16     Перегрузка функций. Значение по умолчанию
Ответ Создать тему
Опции темы

Текущее время: 18:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru