Здравствуйте, Ytz, Вы писали:
_>>(Я): Вот например, простенький пример из жизни: почему в C++ нельзя перегружать функцию по const string& и bool?
Ytz>Ты случайно не перепутал char* со string?
char*, string и bool вместе как раз можно перегружать, а часто даже нужно. Причём возможны любые комбинации char*\string, char*\bool кроме string\bool.
Re[4]: Собеседование: соискатель наносит ответный удар
Здравствуйте, Evgeniy Skvortsov, Вы писали:
ES>а можно пояснить почему не вызывается вариант с std::string ?
Извиняюсь за неточный ответ. Лень гуглить. Но фишка в том, что "" имеет тип char* (const-ы я опустил), т.е. указатель. Указатель это фактически число, которое легко преобразуется в int, а bool — это фактически и есть int, причём это встроенный тип.
А string — это как бы пользовательский класс, причём шаблон. Понятно, что компилятор предпочтёт преобразовать константу во встроенный тип, чем не понятно во что.
Вообще — серьёзная дыра. Хотели строки сделать пользовательскими типами и получилось то, что получилось.
Re[2]: Собеседование: соискатель наносит ответный удар
_>>(Я): Вот например, простенький пример из жизни: почему в C++ нельзя перегружать функцию по const string& и bool? 0>А правда, почему?
функции
void makeSomething(bool par);
void makeSomething(const std::string &par);
Являются примерами довольно неудачного проектирования.
Параметр типа bool хорошо подходит для "примитивных" сеттеров
void setEnabled(bool par);
void setVisible(bool par);
Для сложных вызовов типа (реальный пример из Win32, кстати)
CreateEvent(NULL, TRUE, FALSE, NULL);
Попробуйте сказать по памяти что означает второй и третий параметр.
А как бы было хорошо написать
CreateEvent(NULL, AUTO_RESET_ENABLED, CREATE_SIGNALED, NULL);
В современных API bool имеют тенденцию заменяться на enum:
str.replace("%USER%", user, false); // Qt 3
str.replace("%USER%", user, Qt::CaseInsensitive); // Qt 4
Второй вариант куда читабельней
Проектировать API по человечески надо, тогда таких граблей не будет
Re[7]: Собеседование: соискатель наносит ответный удар
Здравствуйте, alzt, Вы писали:
A>А string — это как бы пользовательский класс, причём шаблон. Понятно, что компилятор предпочтёт преобразовать константу во встроенный тип, чем не понятно во что. A>Вообще — серьёзная дыра. Хотели строки сделать пользовательскими типами и получилось то, что получилось.
Имхо дыра в том, что при наличии неопределённости компилятор принимает решение.
Re[4]: Собеседование: соискатель наносит ответный удар
Здравствуйте, MasterZiv, Вы писали:
MZ>On 25.08.2011 10:59, Evgeniy Skvortsov wrote:
>> а можно пояснить почему не вызывается вариант с std::string ?
MZ>Более высокий приоритет имеет преобразование к встроенному типу bool, MZ>чем к std::string, который класс с конструктором.
Спасибо всем ответившим.
Еще есть один вопрос, для чего в примере используется константная ссылка ?
Я пробовал разные варианта — без константы, без ссылки и всякие сочетания — результат один — преобразовывается к bool.
Re[6]: Собеседование: соискатель наносит ответный удар
ES>Еще есть один вопрос, для чего в примере используется константная ссылка ? ES>Я пробовал разные варианта — без константы, без ссылки и всякие сочетания — результат один — преобразовывается к bool.
Константная ссылка чтобы можно было создать ссылку на временный объект.
Re[6]: Собеседование: соискатель наносит ответный удар
On 25.08.2011 12:21, Evgeniy Skvortsov wrote:
> Еще есть один вопрос, для чего в примере используется константная ссылка ? > Я пробовал разные варианта — без константы, без ссылки и всякие сочетания — > результат один — преобразовывается к bool.
К неконстантной ссылке на string по стандарту нельзя преобразовать строковый
литерал, потому что инициализация неконстантной ссылки ссылкой на временный
объект запрещена. Но не все компиляторы эту заповедь соблюдают.
Posted via RSDN NNTP Server 2.1 beta
Re: Собеседование: соискатель наносит ответный удар
Здравствуйте, 0x7be, Вы писали:
A>>А string — это как бы пользовательский класс, причём шаблон. Понятно, что компилятор предпочтёт преобразовать константу во встроенный тип, чем не понятно во что. A>>Вообще — серьёзная дыра. Хотели строки сделать пользовательскими типами и получилось то, что получилось. 0>Имхо дыра в том, что при наличии неопределённости компилятор принимает решение.
Тут нет неопределённости. Всё очень чётко расписано в стандарте. Просто всё это очень неинтуитивно и очень многие на это напарываются. Либо по незнанию, либо по недосмотру.
Re[6]: Собеседование: соискатель наносит ответный удар
Здравствуйте, Evgeniy Skvortsov, Вы писали:
ES>Спасибо всем ответившим. ES>Еще есть один вопрос, для чего в примере используется константная ссылка ? ES>Я пробовал разные варианта — без константы, без ссылки и всякие сочетания — результат один — преобразовывается к bool.
Добавлю к 2м ответившим. Что как минимум константная ссылка это правило хорошего тона. Если функция не изменяет параметр, то надо либо передавать по значению, либо как константную ссылку.
Если же функция изменяет параметр, то стоит использовать неконстантную ссылку (или указатель), но в данном случае это маловероятно, т.к. метод с таким же названием принимает bool.
Re[3]: Собеседование: соискатель наносит ответный удар
Здравствуйте, Handie, Вы писали:
_>>>(Я): Вот например, простенький пример из жизни: почему в C++ нельзя перегружать функцию по const string& и bool? 0>>А правда, почему?
H>Проектировать API по человечески надо, тогда таких граблей не будет
Возможно требуется переопределить operator<<. Там, конечно тоже enum-ы не помешают, но что делать, если уже есть API с bool-ами. Особенно часто возникает при интеграции с чем-либо.
Re: Собеседование: соискатель наносит ответный удар
Здравствуйте, slava_phirsov, Вы писали:
_>Самые смешных людей я встречал на собеседованиях
_>Интервьюер (И): Я вижу, что многого Вы не знаете и Вам еще много чему нужно учиться. Некоторые вещи, которые должен знать каждый, явно прошли мимо Вас. _>Я (Я): Во-первых, я всю жизнь учусь, во-вторых, все знать невозможно, ну а в-третьих, у каждого свое понимание, что должен знать каждый, а что нет. Уверен, что и Вы не каждый вопрос ответите сходу. _>(И) смотрит на меня с интересом. _>(Я): Вот например, простенький пример из жизни: почему в C++ нельзя перегружать функцию по const string& и bool? _>(И): Почему нельзя? Можно! _>(Я): Хорошо, язык это позволяет, но делать так не стоит. Почему? _>(И)(задумчиво): Неоднозначности тут не возникнет... Вы не правы! _>(Я): Хорошо, подумайте над этим. Вопрос на самом деле нуууу очень простой! _>Вежливо прощаемся.
_>Через день звонит мне на трубку. _>(И): Здравствуйте, С.А., это Вас беспокоят из фирмы XXX. Мы тут подумали... _>Па-па-па-пам! Неужели берут? _>(И): Нам кажется, Вы все-таки заблуждаетесь, и никаких препятствий для такой перегрузки нет! Объясните, почему Вы так считаете, что этого делать нельзя? _>(Я) (еле сдерживаясь, чтобы не начать кататься от смеха по полу): А Вы меня берете, или нет? _>(И): Нет, Вы нам не подходите! _>(Я): Тогда подумайте над этим вопросом сами. _>Кладу трубку.
Подкину Вас ещё вопросик в Вашу коллекцию для хождения на собеседования. "Можно ли без всяких "грязных хаков", чисто используя стандартные средства C++,
в классе-потомке вызвать приватный метод класса-предка?"
99,99% Вам ответят, что "нет", а правильный ответ — "да"
Здравствуйте, Доктор ТуамОсес, Вы писали:
ДТ>Подкину Вас ещё вопросик в Вашу коллекцию для хождения на собеседования. ДТ>"Можно ли без всяких "грязных хаков", чисто используя стандартные средства C++, ДТ>в классе-потомке вызвать приватный метод класса-предка?" ДТ>99,99% Вам ответят, что "нет", а правильный ответ — "да"
Правильный ответ — "а зачем ?", т.к. метод и делается приватным с целью скрыть его от потомков
Re[3]: Собеседование: соискатель наносит ответный удар
Здравствуйте, ishare, Вы писали:
I>Здравствуйте, Доктор ТуамОсес, Вы писали:
ДТ>>Подкину Вас ещё вопросик в Вашу коллекцию для хождения на собеседования. ДТ>>"Можно ли без всяких "грязных хаков", чисто используя стандартные средства C++, ДТ>>в классе-потомке вызвать приватный метод класса-предка?" ДТ>>99,99% Вам ответят, что "нет", а правильный ответ — "да"
I>Правильный ответ — "а зачем ?", т.к. метод и делается приватным с целью скрыть его от потомков
"Зачем?" говорите?
А чтобы показать человеку, который проводит с Вами собеседование, какой он ламер.
Ведь с этой же целью топикстартер задавал свой вопрос?
ДТ>Подкину Вас ещё вопросик в Вашу коллекцию для хождения на собеседования. ДТ>"Можно ли без всяких "грязных хаков", чисто используя стандартные средства C++, ДТ>в классе-потомке вызвать приватный метод класса-предка?" ДТ>99,99% Вам ответят, что "нет", а правильный ответ — "да"
И как его вызвать?
Re[3]: Собеседование: соискатель наносит ответный удар
Здравствуйте, sysenter, Вы писали:
ДТ>>Подкину Вас ещё вопросик в Вашу коллекцию для хождения на собеседования. ДТ>>"Можно ли без всяких "грязных хаков", чисто используя стандартные средства C++, ДТ>>в классе-потомке вызвать приватный метод класса-предка?" ДТ>>99,99% Вам ответят, что "нет", а правильный ответ — "да"
S>И как его вызвать?
Видимо, имеется в виду спецификатор friend в базовом классе для класса наследника