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

Конструктор по умолчанию - C++

Восстановить пароль Регистрация
 
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
11.07.2012, 20:21     Конструктор по умолчанию #1
Здравствуйте, есть такой код:
C++ (Qt)
1
2
    explicit RFileDownloader(QObject *parent = 0);
    explicit RFileDownloader(const QUrl &url = QUrl(), QObject *parent = 0);
Как вы видите, если аргументы конструктора не заданы, но и первый и второй подходят.
Как можно указать компилятору, что в таком случае нужно, например, выбирать 1 конструктор?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.07.2012, 20:28     Конструктор по умолчанию #2
1-й конструктор излишен и его нужно убрать
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.07.2012, 20:30     Конструктор по умолчанию #3
Цитата Сообщение от hepr Посмотреть сообщение
Здравствуйте, есть такой код:
C++ (Qt)
1
2
    explicit RFileDownloader(QObject *parent = 0);
    explicit RFileDownloader(const QUrl &url = QUrl(), QObject *parent = 0);
Как вы видите, если аргументы конструктора не заданы, но и первый и второй подходят.
Как можно указать компилятору, что в таком случае нужно, например, выбирать 1 конструктор?
Компилятор такое не пропустит. Конструктор по умолчанию может быть только один.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.07.2012, 20:36     Конструктор по умолчанию #4
Первый убрать, а во втором поменять аргументы местами. Тогда будет именно то, чего хочешь.
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
11.07.2012, 23:30  [ТС]     Конструктор по умолчанию #5
Цитата Сообщение от Deviaphan Посмотреть сообщение
Первый убрать, а во втором поменять аргументы местами. Тогда будет именно то, чего хочешь.
Было бы все так просто, что например если пользователь хочет указать родителя(QObject), но не указывать QUrl
Компилятор такое не пропустит. Конструктор по умолчанию может быть только один.
Пропускают, причем легко:
GCC даже не пикнул.
MSVC показал предупреждение.
1-й конструктор излишен и его нужно убрать
А что если пользователь хочет указать QObject, но не QUrl?

Добавлено через 2 часа 47 минут
А если обозначить этот вариант:
C++ (Qt)
1
explicit RFileDownloader();
То сработает?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.07.2012, 01:58     Конструктор по умолчанию #6
Цитата Сообщение от hepr Посмотреть сообщение
Пропускают, причем легко:
И какой тогда конструктор будет использоваться при создании объекта?
Пропускают, пока объект не объявлен. А потом: error - неоднозначный вызов перегруженной функции.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
12.07.2012, 02:08     Конструктор по умолчанию #7
Цитата Сообщение от hepr Посмотреть сообщение
Как можно указать компилятору, что в таком случае нужно, например, выбирать 1 конструктор?
Так не получится. Зато можно сделать чтобы выбирался второй.
C++
1
2
explicit RFileDownloader(QObject *parent);
explicit RFileDownloader(const QUrl &url = QUrl(), QObject *parent = 0);
Если указан только parent, то будет использоваться первый, во всех очтальных случаях — второй.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.07.2012, 06:36     Конструктор по умолчанию #8
Цитата Сообщение от hepr Посмотреть сообщение
например если пользователь хочет указать родителя(QObject), но не указывать QUrl
Цитата Сообщение от hepr Посмотреть сообщение
во втором поменять аргументы местами.
Так понятнее?
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
12.07.2012, 13:33  [ТС]     Конструктор по умолчанию #9
Пропускают, пока объект не объявлен. А потом: error - неоднозначный вызов перегруженной функции.
Про это я и не спорю, я говорю, что на само подобное объявление компиляторы не жалуются.

Так понятнее?
А так не будет работать обратное: если пользователь хочет указать QUrl но не QObject

Цитата Сообщение от grizlik78 Посмотреть сообщение
Так не получится. Зато можно сделать чтобы выбирался второй.
C++
1
2
explicit RFileDownloader(QObject *parent);
explicit RFileDownloader(const QUrl &url = QUrl(), QObject *parent = 0);
Если указан только parent, то будет использоваться первый, во всех очтальных случаях — второй.
Спасибо, это то что надо.
Всем большое спасибо за помощь!
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.07.2012, 13:55     Конструктор по умолчанию #10
Цитата Сообщение от hepr Посмотреть сообщение
это то что надо
Без конструктора по умолчанию ты не сможешь создавать объекты в массиве и использовать стандартные алгоритмы. Т.е., загрузить сразу два файла из сети ты уже не сможешь.(
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
12.07.2012, 15:39  [ТС]     Конструктор по умолчанию #11
Цитата Сообщение от Deviaphan Посмотреть сообщение
Без конструктора по умолчанию ты не сможешь создавать объекты в массиве и использовать стандартные алгоритмы. Т.е., загрузить сразу два файла из сети ты уже не сможешь.(
Коструктор по умолчанию будет 2 конструктор, то бишь этот:
C++ (Qt)
1
explicit RFileDownloader(const QUrl &url = QUrl(), QObject *parent = 0);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2012, 15:58     Конструктор по умолчанию
Еще ссылки по теме:

C++ Конструктор по умолчанию
C++ Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
C++ Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром?

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.07.2012, 15:58     Конструктор по умолчанию #12
Упс. Пора поспать разок.
Yandex
Объявления
12.07.2012, 15:58     Конструктор по умолчанию
Ответ Создать тему
Опции темы

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