Re[2]: Собеседование: соискатель наносит ответный удар
От: alzt  
Дата: 25.08.11 07:05
Оценка: 6 (1)
Здравствуйте, Ytz, Вы писали:

_>>(Я): Вот например, простенький пример из жизни: почему в C++ нельзя перегружать функцию по const string& и bool?


Ytz>Ты случайно не перепутал char* со string?


char*, string и bool вместе как раз можно перегружать, а часто даже нужно. Причём возможны любые комбинации char*\string, char*\bool кроме string\bool.
Re[4]: Собеседование: соискатель наносит ответный удар
От: alzt  
Дата: 25.08.11 07:09
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>а можно пояснить почему не вызывается вариант с std::string ?


Извиняюсь за неточный ответ. Лень гуглить. Но фишка в том, что "" имеет тип char* (const-ы я опустил), т.е. указатель. Указатель это фактически число, которое легко преобразуется в int, а bool — это фактически и есть int, причём это встроенный тип.
А string — это как бы пользовательский класс, причём шаблон. Понятно, что компилятор предпочтёт преобразовать константу во встроенный тип, чем не понятно во что.

Вообще — серьёзная дыра. Хотели строки сделать пользовательскими типами и получилось то, что получилось.
Re[2]: Собеседование: соискатель наносит ответный удар
От: Handie  
Дата: 25.08.11 07:23
Оценка: +4
_>>(Я): Вот например, простенький пример из жизни: почему в 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]: Собеседование: соискатель наносит ответный удар
От: MasterZiv СССР  
Дата: 25.08.11 07:42
Оценка:
On 24.08.2011 14:46, Ytz wrote:

> И что? Если не перегружен char*, то просто будет приведение к string. Вполне

> ожидаемое поведение

Ага, или к bool. И угадай, куда оно пойдёт.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Собеседование: соискатель наносит ответный удар
От: 0x7be СССР  
Дата: 25.08.11 07:47
Оценка:
Здравствуйте, alzt, Вы писали:

A>А string — это как бы пользовательский класс, причём шаблон. Понятно, что компилятор предпочтёт преобразовать константу во встроенный тип, чем не понятно во что.

A>Вообще — серьёзная дыра. Хотели строки сделать пользовательскими типами и получилось то, что получилось.
Имхо дыра в том, что при наличии неопределённости компилятор принимает решение.
Re[4]: Собеседование: соискатель наносит ответный удар
От: MasterZiv СССР  
Дата: 25.08.11 08:00
Оценка:
On 25.08.2011 10:59, Evgeniy Skvortsov wrote:

> а можно пояснить почему не вызывается вариант с std::string ?


Более высокий приоритет имеет преобразование к встроенному типу bool,
чем к std::string, который класс с конструктором.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: Собеседование: соискатель наносит ответный удар
От: MasterZiv СССР  
Дата: 25.08.11 08:01
Оценка: +1
On 25.08.2011 11:47, 0x7be wrote:

> Имхо дыра в том, что при наличии неопределённости компилятор принимает решение.


Там нет ни дыры, ни неопределённости.
Есть только неинтуитивность.
Posted via RSDN NNTP Server 2.1 beta
Re[8]: Собеседование: соискатель наносит ответный удар
От: sysenter  
Дата: 25.08.11 08:03
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Ага, или к bool. И угадай, куда оно пойдёт.


Так точно, ещё в Страуструпе кажется написано, что приоритет при приведении отдаётся встроенным типам вместо пользовательских.
Re[5]: Собеседование: соискатель наносит ответный удар
От: Evgeniy Skvortsov Россия  
Дата: 25.08.11 08:21
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>On 25.08.2011 10:59, Evgeniy Skvortsov wrote:


>> а можно пояснить почему не вызывается вариант с std::string ?


MZ>Более высокий приоритет имеет преобразование к встроенному типу bool,

MZ>чем к std::string, который класс с конструктором.

Спасибо всем ответившим.
Еще есть один вопрос, для чего в примере используется константная ссылка ?
Я пробовал разные варианта — без константы, без ссылки и всякие сочетания — результат один — преобразовывается к bool.
Re[6]: Собеседование: соискатель наносит ответный удар
От: sysenter  
Дата: 25.08.11 08:43
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:


ES>Еще есть один вопрос, для чего в примере используется константная ссылка ?

ES>Я пробовал разные варианта — без константы, без ссылки и всякие сочетания — результат один — преобразовывается к bool.

Константная ссылка чтобы можно было создать ссылку на временный объект.
Re[6]: Собеседование: соискатель наносит ответный удар
От: MasterZiv СССР  
Дата: 25.08.11 09:08
Оценка:
On 25.08.2011 12:21, Evgeniy Skvortsov wrote:

> Еще есть один вопрос, для чего в примере используется константная ссылка ?

> Я пробовал разные варианта — без константы, без ссылки и всякие сочетания —
> результат один — преобразовывается к bool.

К неконстантной ссылке на string по стандарту нельзя преобразовать строковый
литерал, потому что инициализация неконстантной ссылки ссылкой на временный
объект запрещена. Но не все компиляторы эту заповедь соблюдают.
Posted via RSDN NNTP Server 2.1 beta
Re: Собеседование: соискатель наносит ответный удар
От: TimurSPB Интернет  
Дата: 25.08.11 09:14
Оценка:
Никогда бы не стал делать такую перегрузку. Да и в отладчике ловиться такой глюк очень легко.
Make flame.politics Great Again!
Re[6]: Собеседование: соискатель наносит ответный удар
От: alzt  
Дата: 25.08.11 09:25
Оценка:
Здравствуйте, 0x7be, Вы писали:

A>>А string — это как бы пользовательский класс, причём шаблон. Понятно, что компилятор предпочтёт преобразовать константу во встроенный тип, чем не понятно во что.

A>>Вообще — серьёзная дыра. Хотели строки сделать пользовательскими типами и получилось то, что получилось.
0>Имхо дыра в том, что при наличии неопределённости компилятор принимает решение.

Тут нет неопределённости. Всё очень чётко расписано в стандарте. Просто всё это очень неинтуитивно и очень многие на это напарываются. Либо по незнанию, либо по недосмотру.
Re[6]: Собеседование: соискатель наносит ответный удар
От: alzt  
Дата: 25.08.11 09:31
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Спасибо всем ответившим.

ES>Еще есть один вопрос, для чего в примере используется константная ссылка ?
ES>Я пробовал разные варианта — без константы, без ссылки и всякие сочетания — результат один — преобразовывается к bool.

Добавлю к 2м ответившим. Что как минимум константная ссылка это правило хорошего тона. Если функция не изменяет параметр, то надо либо передавать по значению, либо как константную ссылку.
Если же функция изменяет параметр, то стоит использовать неконстантную ссылку (или указатель), но в данном случае это маловероятно, т.к. метод с таким же названием принимает bool.
Re[3]: Собеседование: соискатель наносит ответный удар
От: alzt  
Дата: 25.08.11 09:35
Оценка:
Здравствуйте, Handie, Вы писали:

_>>>(Я): Вот например, простенький пример из жизни: почему в C++ нельзя перегружать функцию по const string& и bool?

0>>А правда, почему?

H>Проектировать API по человечески надо, тогда таких граблей не будет


Возможно требуется переопределить operator<<. Там, конечно тоже enum-ы не помешают, но что делать, если уже есть API с bool-ами. Особенно часто возникает при интеграции с чем-либо.
Re: Собеседование: соискатель наносит ответный удар
От: Доктор ТуамОсес Гондурас Мой новый проект "ВЕПРЬ-1"
Дата: 25.08.11 11:54
Оценка:
Здравствуйте, slava_phirsov, Вы писали:

_>Самые смешных людей я встречал на собеседованиях


_>Интервьюер (И): Я вижу, что многого Вы не знаете и Вам еще много чему нужно учиться. Некоторые вещи, которые должен знать каждый, явно прошли мимо Вас.

_>Я (Я): Во-первых, я всю жизнь учусь, во-вторых, все знать невозможно, ну а в-третьих, у каждого свое понимание, что должен знать каждый, а что нет. Уверен, что и Вы не каждый вопрос ответите сходу.
_>(И) смотрит на меня с интересом.
_>(Я): Вот например, простенький пример из жизни: почему в C++ нельзя перегружать функцию по const string& и bool?
_>(И): Почему нельзя? Можно!
_>(Я): Хорошо, язык это позволяет, но делать так не стоит. Почему?
_>(И)(задумчиво): Неоднозначности тут не возникнет... Вы не правы!
_>(Я): Хорошо, подумайте над этим. Вопрос на самом деле нуууу очень простой!
_>Вежливо прощаемся.

_>Через день звонит мне на трубку.

_>(И): Здравствуйте, С.А., это Вас беспокоят из фирмы XXX. Мы тут подумали...
_>Па-па-па-пам! Неужели берут?
_>(И): Нам кажется, Вы все-таки заблуждаетесь, и никаких препятствий для такой перегрузки нет! Объясните, почему Вы так считаете, что этого делать нельзя?
_>(Я) (еле сдерживаясь, чтобы не начать кататься от смеха по полу): А Вы меня берете, или нет?
_>(И): Нет, Вы нам не подходите!
_>(Я): Тогда подумайте над этим вопросом сами.
_>Кладу трубку.

Подкину Вас ещё вопросик в Вашу коллекцию для хождения на собеседования.
"Можно ли без всяких "грязных хаков", чисто используя стандартные средства C++,
в классе-потомке вызвать приватный метод класса-предка?"

99,99% Вам ответят, что "нет", а правильный ответ — "да"
Мой новый проект "ВЕПРЬ-1"
Re[2]: Собеседование: соискатель наносит ответный удар
От: ishare  
Дата: 25.08.11 11:55
Оценка: 4 (1)
Здравствуйте, Доктор ТуамОсес, Вы писали:

ДТ>Подкину Вас ещё вопросик в Вашу коллекцию для хождения на собеседования.

ДТ>"Можно ли без всяких "грязных хаков", чисто используя стандартные средства C++,
ДТ>в классе-потомке вызвать приватный метод класса-предка?"

ДТ>99,99% Вам ответят, что "нет", а правильный ответ — "да"

Правильный ответ — "а зачем ?", т.к. метод и делается приватным с целью скрыть его от потомков
Re[3]: Собеседование: соискатель наносит ответный удар
От: Доктор ТуамОсес Гондурас Мой новый проект "ВЕПРЬ-1"
Дата: 25.08.11 12:26
Оценка:
Здравствуйте, ishare, Вы писали:

I>Здравствуйте, Доктор ТуамОсес, Вы писали:


ДТ>>Подкину Вас ещё вопросик в Вашу коллекцию для хождения на собеседования.

ДТ>>"Можно ли без всяких "грязных хаков", чисто используя стандартные средства C++,
ДТ>>в классе-потомке вызвать приватный метод класса-предка?"

ДТ>>99,99% Вам ответят, что "нет", а правильный ответ — "да"

I>Правильный ответ — "а зачем ?", т.к. метод и делается приватным с целью скрыть его от потомков

"Зачем?" говорите?
А чтобы показать человеку, который проводит с Вами собеседование, какой он ламер.
Ведь с этой же целью топикстартер задавал свой вопрос?
Мой новый проект "ВЕПРЬ-1"
Re[2]: Собеседование: соискатель наносит ответный удар
От: sysenter  
Дата: 25.08.11 12:38
Оценка:
ДТ>Подкину Вас ещё вопросик в Вашу коллекцию для хождения на собеседования.
ДТ>"Можно ли без всяких "грязных хаков", чисто используя стандартные средства C++,
ДТ>в классе-потомке вызвать приватный метод класса-предка?"

ДТ>99,99% Вам ответят, что "нет", а правильный ответ — "да"

И как его вызвать?
Re[3]: Собеседование: соискатель наносит ответный удар
От: c_plus_plus_newbie  
Дата: 25.08.11 13:22
Оценка:
Здравствуйте, sysenter, Вы писали:

ДТ>>Подкину Вас ещё вопросик в Вашу коллекцию для хождения на собеседования.

ДТ>>"Можно ли без всяких "грязных хаков", чисто используя стандартные средства C++,
ДТ>>в классе-потомке вызвать приватный метод класса-предка?"

ДТ>>99,99% Вам ответят, что "нет", а правильный ответ — "да"

S>И как его вызвать?


Видимо, имеется в виду спецификатор friend в базовом классе для класса наследника
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.