придумайте умный вопрос по с++
От: Awaken Украина  
Дата: 15.08.07 20:34
Оценка: 1 (1)
надо для собеседования
большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"),
либо из серии знаешь/не знаешь.
интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"
парочка вопросов которые мне понравились:
-почему в С++ нельзя реализовать полноценный сборщик мусора?
-в каких ситуациях перегрузка левого ++ лучше чем правого ++?
Re: придумайте умный вопрос по с++
От: Sashaka Россия  
Дата: 15.08.07 20:55
Оценка:
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования

A>большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"),
A>либо из серии знаешь/не знаешь.
A>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"
A>парочка вопросов которые мне понравились:
A>-почему в С++ нельзя реализовать полноценный сборщик мусора?
A>-в каких ситуациях перегрузка левого ++ лучше чем правого ++?

а сколько денег дают тому кто может за 10 секунд ответить на такой вопрос?
Re[2]: придумайте умный вопрос по с++
От: Awaken Украина  
Дата: 15.08.07 21:03
Оценка:
S>а сколько денег дают тому кто может за 10 секунд ответить на такой вопрос?

предлагаешь устроить игру "как стать миллионером" с вопросами по с++?
Re[2]: придумайте умный вопрос по с++
От: Cyberax Марс  
Дата: 15.08.07 21:10
Оценка:
Здравствуйте, Sashaka, Вы писали:

A>>-почему в С++ нельзя реализовать полноценный сборщик мусора?

A>>-в каких ситуациях перегрузка левого ++ лучше чем правого ++?
S>а сколько денег дают тому кто может за 10 секунд ответить на такой вопрос?
А что в этих вопросах сложного?

Правда, ответ на них займет явно больше 10 секунд — говорить надо много.
Sapienti sat!
Re[3]: придумайте умный вопрос по с++
От: IROV..  
Дата: 15.08.07 21:17
Оценка: :)
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Sashaka, Вы писали:


A>>>-почему в С++ нельзя реализовать полноценный сборщик мусора?

A>>>-в каких ситуациях перегрузка левого ++ лучше чем правого ++?
S>>а сколько денег дают тому кто может за 10 секунд ответить на такой вопрос?
C>А что в этих вопросах сложного?

C>Правда, ответ на них займет явно больше 10 секунд — говорить надо много.


Да и потом добавит,

Извините что так много наговорил, было мало времени

я не волшебник, я только учусь!
Re: придумайте умный вопрос по с++
От: alexeiz  
Дата: 15.08.07 21:20
Оценка:
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования

A>большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"),
A>либо из серии знаешь/не знаешь.
A>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"

— Как реализовать Singleton?

Причем его нужно задавать в таком коротком виде. И смотреть, что человек знает про Singleton. Так как вопрос открытый, то к решению можно прийти постепенно. Сначала он реализует Meyers Singleton, потом можно попросить сделать его thread-safe. Посмотреть на детали реализации, например: сделан ли конструктор класса закрытым, почему. Потом спросить, как мы будем удалять Singleton (lifetime policy). И так далее.
Re[2]: придумайте умный вопрос по с++
От: Vadim B  
Дата: 15.08.07 21:27
Оценка: +1
Здравствуйте, alexeiz, Вы писали:

A>- Как реализовать Singleton?


A>Причем его нужно задавать в таком коротком виде. И смотреть, что человек знает про Singleton. Так как вопрос открытый, то к решению можно прийти постепенно. Сначала он реализует Meyers Singleton, потом можно попросить сделать его thread-safe. Посмотреть на детали реализации, например: сделан ли конструктор класса закрытым, почему. Потом спросить, как мы будем удалять Singleton (lifetime policy). И так далее.


Ну и для начала выяснить, понимает ли человек границы уникальности объекта, созданного этим синглтоном. Т.е. в рамках чего уникален объект:
— модуль
— thread
— DLL
— процесс
— компьютер
— локальная сеть
— Вселенная
и т.п., и что он будет делать, если подразумеваются другие рамки.
Re[2]: придумайте умный вопрос по с++
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 16.08.07 02:54
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Здравствуйте, Awaken, Вы писали:


A>>надо для собеседования

A>>большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"),
A>>либо из серии знаешь/не знаешь.
A>>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"

A>- Как реализовать Singleton?


A>... Сначала он реализует Meyers Singleton, потом можно попросить сделать его thread-safe...


А потом посмотреть, придёт ли он в конце концов к мысли о том, что если чётко следовать букве стандарта C++ и не операться на особенности конкретных реализаций, то общая реализация thread-safe Singleton`а с автоматическим созданием по первому требованию не возможна впринципе .
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re: придумайте умный вопрос по с++
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 16.08.07 03:10
Оценка: 1 (1)
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования

A>большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"),
A>либо из серии знаешь/не знаешь.
A>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"
A>парочка вопросов которые мне понравились:
A>-почему в С++ нельзя реализовать полноценный сборщик мусора?
A>-в каких ситуациях перегрузка левого ++ лучше чем правого ++?

1.
Выбор конкретной реализации виртуальной функции зависит от реального типа одного аргумента (this), поэтому виртуальные функции называют мультиметодами одного аргумента. Есть парадигма мультиметодов с несколькими аргументами. В этой парадигме конкретная реализации мультиметода зависит от сочетания реальных типов 2-ух или нескольких аргументов. Собственно можно спросить:
почему в C++ есть мультиметоды одного аргумента в виде виртуальных функций, но нет мультиметодов нескольких аргументов.

В ответ надо ждать рассказ о том как устроена реализация виртуальных функций (описания механизма vtbl) и вывод о том, что для случая с несколькими динамическими аргументами механизм vtbl явно не подходит. И более того, вообще не существует их эффективной реализации, а поскольку язык C++ задумывался как высоко эффективный и производительный, то эта весьма удобная пардигма до сих пор не включена в стандарт.

Но я думаю — это уже бонусный вопрос повышенной сложности .


2. Сформулировать вопрос в точности вот в такой форме:
Расскажите чем отличается std::list от std::vector, например, чем std::list<bool> отличается от std::vector<bool>?

В ответ вы должны услышать восторженный возглас о том, что std::vector<bool> вообще стоит особняком среди векторов, так является особо извращённой и неудачной специализацией, использовать его вообще не рекомендуется, и поэтому производить сравнительный анализа списков и векторов на примере std::list<bool> и std::vector<bool> вообще не совсем корректно.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[2]: придумайте умный вопрос по с++
От: Alex Dav Россия  
Дата: 16.08.07 04:43
Оценка:
И где тут "...к ответу приходишь логическим путем..." все выше приведенные вопросы, как раз из области — знаешь не знаешь.
Вот мне однажды задали вопрос — что бы вы изменили в языке С++ если бы он только разрабатывался — вот тут можно долго пообсуждать и проверить логику — хотя тоже в основном на знаешь-незнаешь.
А для логики остаются только всякие головоломки и функции типа преобразовать строку в число, перевернуть строку.
Re: придумайте умный вопрос по с++
От: c-smile Канада http://terrainformatica.com
Дата: 16.08.07 05:40
Оценка: 3 (3) +1 :)
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования


Ну и спрашивай тогда у претендентов: Какой умный вопрос по с++ Вы знаете?
Первые десять отвечают на этот. Остальные десять уже на производные.
Все будут заняты делом и тебе не надо морочить будет голову почтенному собранию.
Re: придумайте умный вопрос по с++
От: IOnlyWantToSay Россия  
Дата: 16.08.07 06:43
Оценка:
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования

A>большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"),
A>либо из серии знаешь/не знаешь.
A>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"
A>парочка вопросов которые мне понравились:
A>-почему в С++ нельзя реализовать полноценный сборщик мусора?
A>-в каких ситуациях перегрузка левого ++ лучше чем правого ++?
Почему-то сразу вспомнился Джоэль Спольски
В действительности все выглядит иначе, чем на самом деле (Станислав Ежи Лец)
Re[2]: придумайте умный вопрос по с++
От: Аноним  
Дата: 16.08.07 06:56
Оценка: 1 (1)
Плохие вопросы.
Слишком завязаны на конкретику.

Тот же std::vector<bool> стоит особняком по совершенно глупым причинам,
которые нет смысла обсуждать на интервью
Сам по себе std::vector<bool> совершенно не интересен.
Re: придумайте умный вопрос по с++
От: bkat  
Дата: 16.08.07 07:00
Оценка: 2 (2)
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования

A>большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"),
A>либо из серии знаешь/не знаешь.

Спрашивай лучше банальщину.
Так распознаешь врунов и новичков.
У тех, у кого реальный опыт, лучше поспрашивать именно про опыт.
Гораздо интереснее и полезнее узнать какие были проблемы и как они решались.
Re[3]: придумайте умный вопрос по с++
От: Awaken Украина  
Дата: 16.08.07 07:21
Оценка:
А>Тот же std::vector<bool> стоит особняком по совершенно глупым причинам,
А>которые нет смысла обсуждать на интервью
А>Сам по себе std::vector<bool> совершенно не интересен.

а мне такой вопрос задавали
но практического смысла в Vector<bool> я не вижу никакого, кроме того чтобы
задавать вопросы о нем на интервью
Re[2]: придумайте умный вопрос по с++
От: Amon-RA  
Дата: 16.08.07 07:27
Оценка:
Самая часто встречающийся баг, который проявляется в Release версии и не проявляется в Debug
Re[3]: придумайте умный вопрос по с++
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 16.08.07 07:38
Оценка:
Здравствуйте, Amon-RA, Вы писали:

AR>Самая часто встречающийся баг, который проявляется в Release версии и не проявляется в Debug


Это ты про код в assert-е ?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: придумайте умный вопрос по с++
От: Amon-RA  
Дата: 16.08.07 07:43
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Это ты про код в assert-е ?


А ну да, это тоже можно. Но я имел ввиду неинициализированные переменные. Пока не промучаешься с пятоком таких багов, не будет твердой уверенности в том, что их таки надо инициализировать
Re[3]: придумайте умный вопрос по с++
От: Awaken Украина  
Дата: 16.08.07 07:48
Оценка:
AR>Самая часто встречающийся баг, который проявляется в Release версии и не проявляется в Debug

интересно когда наоборот в дебаге падает, в релизе работает.
загадка — что это может быть?
Re[4]: придумайте умный вопрос по с++
От: Аноним  
Дата: 16.08.07 07:49
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Здравствуйте, Amon-RA, Вы писали:


AR>>Самая часто встречающийся баг, который проявляется в Release версии и не проявляется в Debug


КД>Это ты про код в assert-е ?


В дебажной версиях переменные нулем обычно инициализируются, а в релизе это не гарантированно. Я чаще всего сталкивался именно с этой проблемой.

Вообще странная ветка какая-то : люди кидают вопросы, но никто на них не отвечает...
Re[4]: придумайте умный вопрос по с++
От: Amon-RA  
Дата: 16.08.07 07:51
Оценка:
Здравствуйте, Awaken, Вы писали:

A>интересно когда наоборот в дебаге падает, в релизе работает.


Не, тут-то как раз можно продебажить, а в релизных багах всякие логи надо придумывать
Re: придумайте умный вопрос по с++
От: rg45 СССР  
Дата: 16.08.07 07:52
Оценка: 4 (2) :)
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования

A>большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"),
A>либо из серии знаешь/не знаешь.
A>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"
A>парочка вопросов которые мне понравились:
A>-почему в С++ нельзя реализовать полноценный сборщик мусора?
A>-в каких ситуациях перегрузка левого ++ лучше чем правого ++?

1. По алгоритмической сложности (не совсем C++, но рядом). Тестируемому предлагается выражениие: O(log(N)). Большинство претендентов без затруднений рассказывают, что это означает. После этого следует провокационный вопрос: "а логарифм здесь по какому основанию?" — вот тут зачастую можно повеселиться

2. По виртуальному наследованию. Откомпилируется ли следующий фрагмент:
class A{};
class B : public A{};
class C : public virtual A{};
int test[sizeof(B) == sizeof(C)];

Как раз тот случай — если немного пошевелить мозгой, то становится ясно, что при разных вариантах наследования, в т.ч. множествнного, с использованием виртуального наследования, без добавления к типу дополнительной информации, не возможно будет выполнять приведение указателей производных типов к базовым.

3. Вопрос чуть посложнее. По автоматическому выведению параметров шаблонных функций. Этот вопрос уже несколько раз проскакивал на этом форуме. Проще на примере:
template<typename T>
class A
{
    typedef T Type;
};
template<typename T>
void foo(const typename A<T>::Type& t)
{
  //...
}
//Где-то в коде пытаемся вызвать foo, рассчитывая, что компилятор автоматически выведет параметр шаблона:
foo(123); //error

То же самое: можно просто знать, что подобные конструкции не должны "дедьюситься" по стандарту, а можно допереть самому, если вспомнить, что у класса A может существать сколько угодно специализаций, в которых Type может определяться как угодно, дублироваться.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: придумайте умный вопрос по с++
От: Sergey Россия  
Дата: 16.08.07 07:58
Оценка:
"Awaken" <12048@users.rsdn.ru> wrote in message news:2623022@news.rsdn.ru...
> AR>Самая часто встречающийся баг, который проявляется в Release версии и не проявляется в Debug
>
> интересно когда наоборот в дебаге падает, в релизе работает.
> загадка — что это может быть?

/GF, который по дефолту врубали для дебаг версий в VC6?
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: придумайте умный вопрос по с++
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 16.08.07 08:04
Оценка:
Здравствуйте, Awaken, Вы писали:

AR>>Самая часто встречающийся баг, который проявляется в Release версии и не проявляется в Debug


A>интересно когда наоборот в дебаге падает, в релизе работает.

A>загадка — что это может быть?

У меня есть такой макрос — RELEASE_CODE(), как раз для таких трюков
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: перегрузка левого ++
От: alzt  
Дата: 16.08.07 08:08
Оценка:
Здравствуйте, Awaken, Вы писали:

A>-в каких ситуациях перегрузка левого ++ лучше чем правого ++?


перегрузка или применение? Если первое — то можно ответить на этот вопрос?
Re[5]: придумайте умный вопрос по с++
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 16.08.07 08:10
Оценка:
Здравствуйте, Amon-RA, Вы писали:

КД>>Это ты про код в assert-е ?


AR>А ну да, это тоже можно. Но я имел ввиду неинициализированные переменные. Пока не промучаешься с пятоком таких багов, не будет твердой уверенности в том, что их таки надо инициализировать


Потом появляется другая трабла — предупреждение о том, что переменной присвоено значение, но оно не было использовано. Лечение
Автор: Коваленко Дмитрий
Дата: 12.11.05
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[5]: придумайте умный вопрос по с++
От: alzt  
Дата: 16.08.07 08:11
Оценка: +2
Здравствуйте, Amon-RA, Вы писали:

КД>>Это ты про код в assert-е ?


AR>А ну да, это тоже можно. Но я имел ввиду неинициализированные переменные. Пока не промучаешься с пятоком таких багов, не будет твердой уверенности в том, что их таки надо инициализировать


А если человек сразу научился всё инициализировать, тогда на вопрос ему будет сложно ответить.
Re[5]: придумайте умный вопрос по с++
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 16.08.07 08:18
Оценка:
Здравствуйте, Amon-RA, Вы писали:

AR>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>Это ты про код в assert-е ?


AR>А ну да, это тоже можно. Но я имел ввиду неинициализированные переменные. Пока не промучаешься с пятоком таких багов, не будет твердой уверенности в том, что их таки надо инициализировать


Вообще говоря, современные компиляторы дают варнинги о таких случаях. BCB вообще любит предупреждать об неиспользуемых аргументах методов.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: придумайте умный вопрос по с++
От: Vzhyk  
Дата: 16.08.07 08:23
Оценка: +1
Awaken пишет:
>
>
> надо для собеседования
Вы бы сначала определились, что вам нужно от данного кандидата, а потом
вопросы сами придумаются.
Posted via RSDN NNTP Server 2.0
Re: придумайте умный вопрос по с++
От: alpha21264 СССР  
Дата: 16.08.07 08:37
Оценка: 3 (2) -1
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования

A>большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"),
A>либо из серии знаешь/не знаешь.
A>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"
A>парочка вопросов которые мне понравились:
A>-почему в С++ нельзя реализовать полноценный сборщик мусора?
A>-в каких ситуациях перегрузка левого ++ лучше чем правого ++?


Попроси оператор присваивания написать вот для такого обьекта:
class Struct
{ int *Massiv1,*Massiv2 ;
};

Если тебе не нравятся массивы, заданные указателем, сделай вектора.

А дальше смотри что будет:
1) Догадается ли он проверить на тождественность обьектов.
2) Освободить память присваиваемого обьекта.
3) Поймать все исключения.
4) Отловить все ситуации, когда под один массив память захватилась, а под другой нет.
5) Корректно откатить ситуацию п 4. не повредив обьект.
6) Не будет ли течь память во всяких ситуациях

Короче. в этом примере может быть 10 различных ошибок. Все я не могу вспомнить.
Если абитуриент делает не больше трех — жить будет.

Течёт вода Кубань-реки куда велят большевики.
Re: придумайте умный вопрос по с++
От: Посторонним В. Беларусь  
Дата: 16.08.07 08:43
Оценка:
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования

A>-почему в С++ нельзя реализовать полноценный сборщик мусора?

Хотелось бы услашать ответ на этот вопрос.
С технологией GC не знаком, но на ум приходят кольцевые ссылки и наличие в C++ деструкторов.
Re[5]: придумайте умный вопрос по с++
От: bkat  
Дата: 16.08.07 08:49
Оценка:
Здравствуйте, Amon-RA, Вы писали:

AR>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>Это ты про код в assert-е ?


AR>А ну да, это тоже можно. Но я имел ввиду неинициализированные переменные.


Что показывает, что вопрос в такой форме, смысла особого не имеет
(особенно если есть четкие представления о "правильном" ответе).
Я, к примеру, уже и не помню, когда с такой проблемой сталкивался.
У нас в стандарте кодирования стоит требование инициализировать все переменные при объявлении.

Лучше тогда спросить о том какие вообще проблемы могут возникать при переходе от "дебага" в "релиз".
Насколько часто и что конкретно встречается — это зависит от команды и процессов.
Re[2]: придумайте умный вопрос по с++
От: Кодт Россия  
Дата: 16.08.07 09:08
Оценка: 11 (3) +1
Здравствуйте, Mr. None, Вы писали:

MN>1.

MN>Выбор конкретной реализации виртуальной функции зависит от реального типа одного аргумента (this), поэтому виртуальные функции называют мультиметодами одного аргумента. Есть парадигма мультиметодов с несколькими аргументами. В этой парадигме конкретная реализации мультиметода зависит от сочетания реальных типов 2-ух или нескольких аргументов. Собственно можно спросить:
MN>почему в C++ есть мультиметоды одного аргумента в виде виртуальных функций, но нет мультиметодов нескольких аргументов.

MN>В ответ надо ждать рассказ о том как устроена реализация виртуальных функций (описания механизма vtbl)

Не надо ждать этот рассказ. Vtbl — одна из возможных реализаций, самая дешёвая на распространённых платформах. Но С++ абстрагирован от неё, следовательно, не в этом дело.

MN> и вывод о том, что для случая с несколькими динамическими аргументами механизм vtbl явно не подходит.

Глупости. Двойная диспетчеризация (одна из стратегий мультиметодов) прекрасно ездит на обычных виртуальных функциях.

MN> И более того, вообще не существует их эффективной реализации, а поскольку язык C++ задумывался как высоко эффективный и производительный, то эта весьма удобная пардигма до сих пор не включена в стандарт.

Дело в другом.

Причина номер раз.
Есть ровно одна стратегия диспетчеризации с полиморфизмом по 1 аргументу (неважно, имеется в виду виртуальность или ad-hoc-полиморфизм времени компиляции):
— выбор сигнатуры наиболее близкого предка фактического (или формального, если это compile-time) типа аргумента.

А с полиморфизмом по 2 и более аргументам... Во время компиляции ты просто получишь заявление о неоднозначности, и привет. Разруливай сам.
Во время исполнения — стратегий уйма
1) нужна сетка сигнатур, покрывающая всё декартово произведение фактических типов
2) выбор первой подходящей сигнатуры среди множества линейно перечисленных (так устроен pattern matching у большинства ФЯ)
3) выбор множества наиболее подходящих по одному аргументу, затем среди них — наиболее подходящей по второму (двойная диспетчеризация, механизм обработки оконных сообщений)
4) всякое затейливое ранжирование (например, сперва выбираем, какой из аргументов более достоин, и затем делаем двойную диспетчеризацию)
5) выбор точного соответствия, а если его нет — выбор дефолтного варианта (pattern matching у Миранды, в какой-то степени — у языка шаблонов С++)
Ну и которую из них выбрать?



Причина номер два.
Размазанность или сосредоточенность объявления мультиметода.
Виртуальные функции объявляются рядом (внутри) объявления соответствующих классов.
Где объявлять мультиметоды?

Например, специализации шаблонов С++ можно раскидать. И перегрузки функций тоже можно раскидать.
Правда, в ряде случаев это приводит к неожиданностям — на грани или за гранью нарушения ODR. А сколько было головняка у авторов компиляторов, чтобы правильно реализовать ADL?
А в случае стратегии номер 2, ещё и порядок объявления становится неопределённым (как компилятору и линкеру в голову взбредёт).

Сосредоточить объявление мультиметода в одном месте — сделать программу немасштабируемой.
Поручить формирование мультиметода рантайму (пусть пользователь сам регистрирует сигнатуры) — честно, но некрасиво.

Поэтому чаще всего используют рукодельное воплощение стратегии номер 3, т.е. двойную диспетчеризацию.
Причём интересно, что у обработчика оконных сообщений доминантным является первый аргумент (объект-обработчик), а у классической двойной диспетчеризации, как ни странно, второй аргумент!

MN>Но я думаю — это уже бонусный вопрос повышенной сложности .


Естественно.

MN>2. Сформулировать вопрос в точности вот в такой форме:

MN>Расскажите чем отличается std::list от std::vector, например, чем std::list<bool> отличается от std::vector<bool>?

MN>В ответ вы должны услышать восторженный возглас о том, что std::vector<bool> вообще стоит особняком среди векторов, так является особо извращённой и неудачной специализацией, использовать его вообще не рекомендуется, и поэтому производить сравнительный анализа списков и векторов на примере std::list<bool> и std::vector<bool> вообще не совсем корректно.


Восторженный?
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[5]: придумайте умный вопрос по с++
От: Кодт Россия  
Дата: 16.08.07 09:08
Оценка:
Здравствуйте, <Аноним>, Вы писали:

AR>>>Самая часто встречающийся баг, который проявляется в Release версии и не проявляется в Debug

КД>>Это ты про код в assert-е ?

А>В дебажной версиях переменные нулем обычно инициализируются, а в релизе это не гарантированно. Я чаще всего сталкивался именно с этой проблемой.

Ха! Запусти под баундс-чекером, он тебе так наинициализирует... (0x5EE5, кажется).

Ещё баг — неспецифицированное поведение, связанное с порядком вычисления аргументов функции. В дебаге, как правило, используется cdecl, и аргументы вычисляются справа налево. В релизе как бог на душу положит.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: придумайте умный вопрос по с++
От: Константин Л. Франция  
Дата: 16.08.07 09:34
Оценка:
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования

A>большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"),
A>либо из серии знаешь/не знаешь.
A>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"

а кожалению, так не бывает. Либо ты задаешь конкретные вопросы по языку, либо вообще абстрагируясь от конкретного языка.

По языку всегда интересны вопросы про templates, poi, spicialization/overriding.

Ну вот, например (более-менее слодный только третий):

1.


#include <iostream>

struct S
{
    void f()
    {
        std::cout<< "Hello, world!" << std::endl;
    }
};

int main()
{
    S* s = NULL;
    s->f();
}


//Why this code "works" fine and outs "Hello, world!"

2.


#include <iostream>

template <class T>
void f( T t )
{
    std::cout<< t << std::endl;
}

void f( int value )
{
    std::cout<< value << std::endl;
}

int main()
{
    f(10); //*1*
}


//What function will be called in *1*?

3.


template <class T>
struct Foo
{
    typedef typename T::some_type some_type;
};

struct Bar : public Foo<Bar>
{
    typedef int some_type;
};

int main()
{
    Bar b;
}



A>парочка вопросов которые мне понравились:

A>-почему в С++ нельзя реализовать полноценный сборщик мусора?
A>-в каких ситуациях перегрузка левого ++ лучше чем правого ++?
Re[2]: Три коммента и вопрос
От: Erop Россия  
Дата: 16.08.07 09:41
Оценка:
Здравствуйте, Mr. None, Вы писали:

A>>-почему в С++ нельзя реализовать полноценный сборщик мусора?

A>>-в каких ситуациях перегрузка левого ++ лучше чем правого ++?

MN>1.

MN>Выбор конкретной реализации виртуальной функции зависит от реального типа одного аргумента (this), поэтому виртуальные функции называют мультиметодами одного аргумента. Есть парадигма мультиметодов с несколькими аргументами. В этой парадигме конкретная реализации мультиметода зависит от сочетания реальных типов 2-ух или нескольких аргументов. Собственно можно спросить:
MN>почему в C++ есть мультиметоды одного аргумента в виде виртуальных функций, но нет мультиметодов нескольких аргументов.

1) ИМХО этот вопрос очень спорный. Кроме того лично мне не понятно нужно ли мне от сотрудника знать что такое "мультиметоды". Я же про лямбда-исчисление его не спрашиваю, и про ТКС, скажем, тоже. И даже про кинетику фенолов Короче прользя от такого вопроса не ясна

2) Твой ответ более чем спорный. Скажем dynamic_cast тоже плохо ложится на vtbl реализацию, тем не менее он есть.
Я бы ответил, что мультиметоды -- очень сложный, редкий паттерн, который, к тому же, может иметь очень много существенных подробностей реализации. Поэтому нет способа обобщить их так, чтобы всем было удобно. А сдругой стороны, можно просто довольно реализовать те или иные стратегии реализации мультиметодов непосредственно.

3) Кстати говоря, у меня на твой вопрос-ответ есть встречный вопрос. А почему рализацию мульти-методов не включили до сих пор в STL? Тут-то vtbl вроде не мешает?


MN>2. Сформулировать вопрос в точности вот в такой форме:
MN>Расскажите чем отличается std::list от std::vector, например, чем std::list<bool> отличается от std::vector<bool>?

ИМХО глупая подколка не имеющая практического смысла, к тому же. Лично я бы сильно убавил уважения к экзаменатору, который такие вопросы задаёт. И подумал, хочу ли я, чтобы мои коллеги были людми, которые на такие вопросы отвечают


А вообще-то три коммента у меня есть
1) Задавая "умный" вопрос стоит быть таки уверенным в его однозначном ответе. А то можно и опозорится
2) Задавая вопрос ты не только узнаёшь что-то о кандидате, но ипоказываешь кандидату что-то о себе. И стоит подумать что ты хочешь о себе рассказывать, а чего не стоит
3) Кандидат на собеседовании находится в состоянии стресса, на кой его усугублять ещё и подколками?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: легко :)
От: Erop Россия  
Дата: 16.08.07 09:44
Оценка: 1 (1)
Здравствуйте, Awaken, Вы писали:

A>интересно когда наоборот в дебаге падает, в релизе работает.

A>загадка — что это может быть?

    int * p = 0;
    assert( 7 != *p );
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 16.08.07 09:48
Оценка:
Здравствуйте, Посторонним В., Вы писали:

A>>-почему в С++ нельзя реализовать полноценный сборщик мусора?

ПВ>Хотелось бы услашать ответ на этот вопрос.
ПВ>С технологией GC не знаком, но на ум приходят кольцевые ссылки и наличие в C++ деструкторов.


Я думаю, что корень зла -- невозможность узнать структуру объекта.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: глупый, но логически выводимый
От: Erop Россия  
Дата: 16.08.07 09:53
Оценка:
Здравствуйте, Awaken, Вы писали:

A>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"


1) Какие соглашения о вызове совместимы с функциями с переменным числом параметров (которые ...)?
ИМХО этот вопрос задавать на собеседовании глупо

2) Если я заключу кусок кода в
extern "c" {
тут код
}
, то что-нибудь в коде поменяется?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: придумайте умный вопрос по с++
От: remark Россия http://www.1024cores.net/
Дата: 16.08.07 10:06
Оценка: 3 (2)
Здравствуйте, Посторонним В., Вы писали:

ПВ>Здравствуйте, Awaken, Вы писали:


A>>надо для собеседования

A>>-почему в С++ нельзя реализовать полноценный сборщик мусора?

ПВ>Хотелось бы услашать ответ на этот вопрос.

ПВ>С технологией GC не знаком, но на ум приходят кольцевые ссылки и наличие в C++ деструкторов.

Имхо, это не составляет проблем, основные засады — наличие арифметики с указателями (они же хендлы объекты) и нетипибезопасность.

Например, законный (ну если и не законный, то так скажем... возможно используемый... в том или ином виде) пример:

char* p = 0;

void alloc()
{
  char* l = (char*)malloc(100);
  p = l + 200;
}

void use()
{
  char* l = p - 200;
  // ...
}


Или что-то типа такого:

A* a = 0;
B* b = 0;

void alloc()
{
  char* p = (char*)malloc(100);
  a = new (p + 10) A();
  b = new (p + 60) B();
}


В языках со встроенной сборкой мусора нет адресной арифметики, нет inner pointer (указателей "внутрь" объекта). Если объектные хендлы — есть чётко типизированные хендлы "на начало" объекта.

В этом смысле cli::inner_ptr из c++/cli создаёт определённые трудности, но там ввели дополнительные ограничения и требования.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: придумайте умный вопрос по с++
От: remark Россия http://www.1024cores.net/
Дата: 16.08.07 10:10
Оценка: 5 (1) +1
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования

A>большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"),
A>либо из серии знаешь/не знаешь.
A>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"
A>парочка вопросов которые мне понравились:
A>-почему в С++ нельзя реализовать полноценный сборщик мусора?
A>-в каких ситуациях перегрузка левого ++ лучше чем правого ++?


Я обычно в такой ситуации беру книжку типа Стандартов кодирования Саттера и Александреску и спрашиваю по какой-либо главе, прошу привести "открытый" ответ — какое общее правило, какое обоснование, какие засады, когда надо делать по-другому и т.д.
В таких книгах освещены как раз "правильные" вопросы — не очень поверхностные, и не очень "в дебри", как раз "кандидатский минимум"
Если же этот человек читал раньше и помнит эту книгу , тогда, во-первых, это уже на 90% "правильный" человек , во-вторых, тогда уже можно поговорить на более интересные темы.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 16.08.07 10:26
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>а кожалению, так не бывает. Либо ты задаешь конкретные вопросы по языку, либо вообще абстрагируясь от конкретного языка.

Почему? С++ довольно логично устроен, вообще-то.

КЛ>По языку всегда интересны вопросы про templates, poi, spicialization/overriding.

Я бы их не стал задавать. Но у моих подчинённых и использование своих шаблонов запрещенно...

КЛ>1.

КЛ>//Why this code "works" fine and outs "Hello, world!"

Потому что UB может быть и таким? Или ты какой ответ расчитываешь получить?

КЛ>2.

КЛ>//What function will be called in *1*?
Ты бы хоть вывод разный в разных функциях сделал...
А в целом хотелось бы понять что тут такого "умного" и зачем это всё надо при работе?
Вообще засчем так программировать, что зависишь от типа литерала
10


КЛ>3.

Вопроса нет
Нужно догадаться, что хотел спросить автор? Типа "будет ли компилироваться код?"
ИМХО так тоже не стоит прогать. Соответственно не понятно хорошо ли то, что кандидат умеет искать такие ошибки


Тогда уж вот тебе вопрос, в коллекцию:

class CMyOps {
public:
    void exit( int code ) { std::cout << "Exit code: " << code << std::endl; }

};

template<class T>
class CMyProcessor : T {
public:
    ToDo() { exit( 1 ); }
};

int main()
{
    CMyProcessor<CMyOps> p;
    p.ToDo();
    std::cout << "All right!!!" << std::endl;
}


Что напечатает эта программа?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: придумайте умный вопрос по с++
От: AndrewJD США  
Дата: 16.08.07 10:38
Оценка: 6 (1)
Здравствуйте, Erop, Вы писали:

E>Тогда уж вот тебе вопрос, в коллекцию:


E>
E>class CMyOps {
E>public:
E>    void exit( int code ) { std::cout << "Exit code: " << code << std::endl; }

E>};

E>template<class T>
E>class CMyProcessor : T {
E>public:
E>    ToDo() { exit( 1 ); }
E>};

E>int main()
E>{
E>    CMyProcessor<CMyOps> p;
E>    p.ToDo();
E>    std::cout << "All right!!!" << std::endl;
E>}



А что здесь не так? Кроме пропущеного void в ToDo?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[4]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 16.08.07 10:54
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>А что здесь не так? Кроме пропущеного void в ToDo?

За void спасибо. Это ошибка.

А не так, то, что ИМХО ничего не напечатает
Вопрос почему.
Отдельный вопрос на кой такие вопрос на собеседовании задавать?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: придумайте умный вопрос по с++
От: OdesitVadim Украина  
Дата: 16.08.07 11:50
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, AndrewJD, Вы писали:


AJD>>А что здесь не так? Кроме пропущеного void в ToDo?

E>За void спасибо. Это ошибка.

E>А не так, то, что ИМХО ничего не напечатает

E>Вопрос почему.
загнал в компилятор.Печатает. Вопрос что не так.
Проверял на стареньком VC++ 6 версии и на свеженьком gcc, правда тому не понравилось определение ToDo и он попросил указать переметр -fpermisive при компиляуции. Применив оного я получил опять ожидаемый результат.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re[6]: придумайте умный вопрос по с++
От: night beast СССР  
Дата: 16.08.07 11:57
Оценка: +1
Здравствуйте, OdesitVadim, Вы писали:

AJD>>>А что здесь не так? Кроме пропущеного void в ToDo?

E>>За void спасибо. Это ошибка.

E>>А не так, то, что ИМХО ничего не напечатает

E>>Вопрос почему.
OV>загнал в компилятор.Печатает. Вопрос что не так.
OV>Проверял на стареньком VC++ 6 версии и на свеженьком gcc, правда тому не понравилось определение ToDo и он попросил указать переметр -fpermisive при компиляуции. Применив оного я получил опять ожидаемый результат.

двухфазный поиск имен?

шестерка его не поддерживает.

кстати, если всегда ставить this перед мемберами, то и проблем таких не будет.
Re[7]: придумайте умный вопрос по с++
От: OdesitVadim Украина  
Дата: 16.08.07 12:02
Оценка:
Здравствуйте, night beast, Вы писали:

NB>двухфазный поиск имен?


NB>шестерка его не поддерживает.

Двуфазный или трёхфазный не знаю, не читал об этом, но компилирует. мало того, даже когда void перед ToDo не было, всё равно собрал, правда ругнулся, мол ToDo похож на конструктор...
хм, если перед exit поставить :: то будет работать корректно.
З.Ы. Точно шестёрка с всемы паками. Почему 6? ну на роботе её как среду для армовского компилятора используем.
NB>кстати, если всегда ставить this перед мемберами, то и проблем таких не будет.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re[8]: придумайте умный вопрос по с++
От: night beast СССР  
Дата: 16.08.07 12:10
Оценка: +1
Здравствуйте, OdesitVadim, Вы писали:

NB>>двухфазный поиск имен?


NB>>шестерка его не поддерживает.

OV>Двуфазный или трёхфазный не знаю, не читал об этом, но компилирует. мало того, даже когда void перед ToDo не было, всё равно собрал, правда ругнулся, мол ToDo похож на конструктор...

дык вопрос был не в том, компилируется, или нет, а в том что выводит.
при двухфазном поиске вызовется глобальня функция и прога ничего не напечатает.

OV>хм, если перед exit поставить :: то будет работать корректно.

OV>З.Ы. Точно шестёрка с всемы паками. Почему 6? ну на роботе её как среду для армовского компилятора используем.
NB>>кстати, если всегда ставить this перед мемберами, то и проблем таких не будет.
Re[2]: придумайте умный вопрос по с++
От: Roman Odaisky Украина  
Дата: 16.08.07 12:15
Оценка: :)
Здравствуйте, alexeiz, Вы писали:

A>- Как реализовать Singleton?


Я уже представляю, что будет, если на это собеседование придет IB.
До последнего не верил в пирамиду Лебедева.
Re[8]: придумайте умный вопрос по с++
От: Nuzur  
Дата: 16.08.07 12:16
Оценка:
Подтверждаю 6й вижуал 5й пак, откомпили, результат как ни странно(гыгы) 1-ца. Только ретурн добавил и воид усьо.
А чем там прикол не могу понять!
Re[9]: придумайте умный вопрос по с++
От: OdesitVadim Украина  
Дата: 16.08.07 12:25
Оценка:
Здравствуйте, Nuzur, Вы писали:

N>Подтверждаю 6й вижуал 5й пак, откомпили, результат как ни странно(гыгы) 1-ца. Только ретурн добавил и воид усьо.

N>А чем там прикол не могу понять!
Будем ждать ответа от задавшего вопрос Егора
Может это вопрос с подколкой?
Хотя 6 студия всегда отличалась своим восприятием стандарта
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re[4]: придумайте умный вопрос по с++
От: IID Россия  
Дата: 16.08.07 12:27
Оценка:
Здравствуйте, Awaken, Вы писали:

AR>>Самая часто встречающийся баг, который проявляется в Release версии и не проявляется в Debug


A>интересно когда наоборот в дебаге падает, в релизе работает.

A>загадка — что это может быть?

проезд по памяти ? в релизе "удачно" расположились подходящие байты за пределами блока, а в дебаге при чтении наелись 0xcccccccc ? Или при записи в дебаге вылезли за страницу, а релизе потерли соседей.
kalsarikännit
Re[2]: придумайте умный вопрос по с++
От: Roman Odaisky Украина  
Дата: 16.08.07 12:32
Оценка: 1 (1)
Здравствуйте, alpha21264, Вы писали:

A>Попроси оператор присваивания написать вот для такого обьекта:

A>class Struct
A>{ int *Massiv1,*Massiv2 ;
A>};

A>Если тебе не нравятся массивы, заданные указателем, сделай вектора.


Так если вектора, то ничего не нужно писать вообще, дефолтный оператор справится.

A>А дальше смотри что будет:

A>1) Догадается ли он проверить на тождественность обьектов.
A>2) Освободить память присваиваемого обьекта.
A>3) Поймать все исключения.
A>4) Отловить все ситуации, когда под один массив память захватилась, а под другой нет.
A>5) Корректно откатить ситуацию п 4. не повредив обьект.
A>6) Не будет ли течь память во всяких ситуациях

п. 3 — ???

A>Короче. в этом примере может быть 10 различных ошибок. Все я не могу вспомнить.

A>Если абитуриент делает не больше трех — жить будет. :))

Элементарно.

C++98, C++03:
HelloSutter& HelloSutter::operator =(HelloSutter other)
{
    swap(other);
    return *this;
}

C++09:
HelloSutter& HelloSutter::operator =(HelloSutter other)
{
    return *this = std::move(other);
}
До последнего не верил в пирамиду Лебедева.
Re[3]: придумайте умный вопрос по с++
От: Roman Odaisky Украина  
Дата: 16.08.07 12:36
Оценка:
Здравствуйте, Erop, Вы писали:

E>Тогда уж вот тебе вопрос, в коллекцию:


E>
E>class CMyOps {
E>public:
E>    void exit( int code ) { std::cout << "Exit code: " << code << std::endl; }

E>};

E>template<class T>
E>class CMyProcessor : T {
E>public:
E>    void ToDo() { exit( 1 ); }
E>};

E>int main()
E>{
E>    CMyProcessor<CMyOps> p;
E>    p.ToDo();
E>    std::cout << "All right!!!" << std::endl;
E>}


E>Что напечатает эта программа?


Попытается вызвать ::exit(int), ибо в зависимые базы ADL не лезет. За неимением такой функции не скомпилируется.
До последнего не верил в пирамиду Лебедева.
Re[3]: придумайте умный вопрос по с++
От: remark Россия http://www.1024cores.net/
Дата: 16.08.07 12:39
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>C++98, C++03:

RO>
RO>HelloSutter& HelloSutter::operator =(HelloSutter other)
RO>{
RO>    swap(other);
RO>    return *this;
RO>}
RO>

RO>C++09:
RO>
RO>HelloSutter& HelloSutter::operator =(HelloSutter other)
RO>{
RO>    return *this = std::move(other);
RO>}
RO>


Оптимальное решение для всех версий языка:

HelloSutter& HelloSutter::operator = (HelloSutter const& other)
{
  return this->assign_impl(other);
}





1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: придумайте умный вопрос по с++
От: OdesitVadim Украина  
Дата: 16.08.07 12:42
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:


E>>Что напечатает эта программа?


RO>Попытается вызвать ::exit(int), ибо в зависимые базы ADL не лезет. За неимением такой функции не скомпилируется.

Так компилируется! правда гцц хочет параметр специальный, а то говорит
f3.cpp: In member function 'void CMyProcessor<T>::ToDo()':
f3.cpp:14: error: there are no arguments to 'exit' that depend on a template parameter, so a declaration of 'exit' must be available
f3.cpp:14: error: (if you use '-fpermissive', G++ will accept your code, but all owing the use of an undeclared name is deprecated)
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re[9]: придумайте умный вопрос по с++
От: OdesitVadim Украина  
Дата: 16.08.07 12:42
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, OdesitVadim, Вы писали:


NB>дык вопрос был не в том, компилируется, или нет, а в том что выводит.

NB>при двухфазном поиске вызовется глобальня функция и прога ничего не напечатает.

ну а последненький gcc поддерживает двухвазный поиск?
Ибо оба компилятора отработали одинаково — выводят такое
Exit code: 1
All right!
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re[10]: придумайте умный вопрос по с++
От: night beast СССР  
Дата: 16.08.07 12:49
Оценка: +1
Здравствуйте, OdesitVadim, Вы писали:

NB>>дык вопрос был не в том, компилируется, или нет, а в том что выводит.

NB>>при двухфазном поиске вызовется глобальня функция и прога ничего не напечатает.

OV>ну а последненький gcc поддерживает двухвазный поиск?


поддерживает.
gcc 3.4.2 ничего не печатает.
Re[4]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 16.08.07 12:50
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

E>>Что напечатает эта программа?

RO>Попытается вызвать ::exit(int), ибо в зависимые базы ADL не лезет. За неимением такой функции не скомпилируется.
Упс!
Надо ещё что-то типа stdlib включить, чтобы exit( int ) таки была
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Давайте проверим?
От: Roman Odaisky Украина  
Дата: 16.08.07 12:53
Оценка:
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования :-)


У меня почему-то сложилось впечатление, что под собеседованием разные люди понимают очень и очень разные вещи. По крайней мере, под «хорошим» собеседованием.

Давайте проверим.

Вы пришли на собеседование. Вам предлагают следующий вопрос, мало раскрытый в литературе: развернуть строку задом наперед. Уточню: одна функция возвращает данные, а вторая их обрабатывает, но по той или иной причине эти функции расходятся во взглядах на то, с какого конца за эти данные следует браться. Итак, данные нужно развернуть.



Разумеется, я заранее знаю «правильный» ответ, и ничто меня не поколеблет в этой уверенности. Кто угадает его, поставлю тройку :-)

Ваши предложения?
До последнего не верил в пирамиду Лебедева.
Re[2]: Давайте проверим?
От: Smal Россия  
Дата: 16.08.07 12:57
Оценка: 14 (1)
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Awaken, Вы писали:


A>>надо для собеседования


RO>У меня почему-то сложилось впечатление, что под собеседованием разные люди понимают очень и очень разные вещи. По крайней мере, под «хорошим» собеседованием.


RO>Давайте проверим.


RO>Вы пришли на собеседование. Вам предлагают следующий вопрос, мало раскрытый в литературе: развернуть строку задом наперед. Уточню: одна функция возвращает данные, а вторая их обрабатывает, но по той или иной причине эти функции расходятся во взглядах на то, с какого конца за эти данные следует браться. Итак, данные нужно развернуть.


RO>


RO>Разумеется, я заранее знаю «правильный» ответ, и ничто меня не поколеблет в этой уверенности. Кто угадает его, поставлю тройку


RO>Ваши предложения?


rbegin/rend ?
С уважением, Александр
Re[5]: придумайте умный вопрос по с++
От: OdesitVadim Украина  
Дата: 16.08.07 13:03
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Roman Odaisky, Вы писали:


E>>>Что напечатает эта программа?

RO>>Попытается вызвать ::exit(int), ибо в зависимые базы ADL не лезет. За неимением такой функции не скомпилируется.
E>Упс!
E>Надо ещё что-то типа stdlib включить, чтобы exit( int ) таки была
Да, если добавить #include <stdlib.h>, то ничего не выведет. Но заметье, что в исходной задаче об этом ни слова.
Также я уже писал, что можно просто :: перед exit поставить.
Так что ответом наверное будет таков
дайте мне точно версию компилятора и точных исходный код. Иначе поведение не определено. А вопрошающему поставить минус за неполную формулировку задачи
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re[6]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 16.08.07 13:13
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

E>>Надо ещё что-то типа stdlib включить, чтобы exit( int ) таки была

OV>Да, если добавить #include <stdlib.h>, то ничего не выведет. Но заметье, что в исходной задаче об этом ни слова.
Ну там и про std::cout тоже ни слова

OV>Также я уже писал, что можно просто :: перед exit поставить.

Вообще-то логичнее было бы this->

OV>дайте мне точно версию компилятора и точных исходный код. Иначе поведение не определено. А вопрошающему поставить минус за неполную формулировку задачи


Вообще-то вопрос про знание особенностей C++. То что ты не знаешь о функции exit тодже интересно.

Но мне этот вопрос всё равно не нравится
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: глупый, но логически выводимый
От: Erop Россия  
Дата: 16.08.07 13:18
Оценка:
Здравствуйте, Erop, Вы писали:

E>1) Какие соглашения о вызове совместимы с функциями с переменным числом параметров (которые ...)?

E>ИМХО этот вопрос задавать на собеседовании глупо

E>2) Если я заключу кусок кода в
extern "c" {
тут код
}
, то что-нибудь в коде поменяется?


Прикольно, что никто е пробует отвечать...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: придумайте умный вопрос по с++
От: OdesitVadim Украина  
Дата: 16.08.07 13:31
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, OdesitVadim, Вы писали:


E>>>Надо ещё что-то типа stdlib включить, чтобы exit( int ) таки была

OV>>Да, если добавить #include <stdlib.h>, то ничего не выведет. Но заметье, что в исходной задаче об этом ни слова.
E>Ну там и про std::cout тоже ни слова
Не понял юмора.
OV>>Также я уже писал, что можно просто :: перед exit поставить.
E>Вообще-то логичнее было бы this->
Это зависит от того, что мы хотим видеть под функцией exit
OV>>дайте мне точно версию компилятора и точных исходный код. Иначе поведение не определено. А вопрошающему поставить минус за неполную формулировку задачи

E>Вообще-то вопрос про знание особенностей C++.

знаем мы таких вопрошающих. задали мне задачку были на одном собеседовании, правда меня там хотели как пхп кодера брать. Но задача была не решаема в принципе(это я дома понял, когда более подробно литературу почитал). Я потратил час на собеседовании, но не смог устранить глюк (устранение которого и было решение задачи). Естественно мне сказали, что ты ничего не понимаеш, так как не можеш решить простую задачку. Решив дома я пришёл к ним на следующий день и сказал, что знаю решение. На что они ответили, что не против его получить, так как над решением бьются сами не первый день. Ответ был прост — перепроектировать всё (типичный для словянского менталитета. И обяснил им о глюках. Роботу предлагали, но я уже отказался. Не могу, когда мной командует человек, который неумеет ставить задачки.
E>То что ты не знаешь о функции exit тодже интересно.
С чего это бы?
E>Но мне этот вопрос всё равно не нравится
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re[8]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 16.08.07 13:35
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

E>>>>Надо ещё что-то типа stdlib включить, чтобы exit( int ) таки была

OV>>>Да, если добавить #include <stdlib.h>, то ничего не выведет. Но заметье, что в исходной задаче об этом ни слова.
E>>Ну там и про std::cout тоже ни слова
OV>Не понял юмора.
Ну в вопросе было и std::cout и exit.
Для одного ты include написал, а для другого нет. Интересно почему?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: придумайте умный вопрос по с++
От: alpha21264 СССР  
Дата: 16.08.07 13:38
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, alpha21264, Вы писали:


A>>Попроси оператор присваивания написать вот для такого обьекта:

A>>class Struct
A>>{ int *Massiv1,*Massiv2 ;
A>>};

A>>Если тебе не нравятся массивы, заданные указателем, сделай вектора.


RO>Так если вектора, то ничего не нужно писать вообще, дефолтный оператор справится.


Или я чего-то не понимаю, или ты не прошел тест.
Что произойдет, если первый массив скопировался, а на второй не хватило памяти?

A>>А дальше смотри что будет:

A>>1) Догадается ли он проверить на тождественность обьектов.
A>>2) Освободить память присваиваемого обьекта.
A>>3) Поймать все исключения.
A>>4) Отловить все ситуации, когда под один массив память захватилась, а под другой нет.
A>>5) Корректно откатить ситуацию п 4. не повредив обьект.
A>>6) Не будет ли течь память во всяких ситуациях

RO>п. 3 — ???


что делает new при нехватке памяти?

A>>Короче. в этом примере может быть 10 различных ошибок. Все я не могу вспомнить.

A>>Если абитуриент делает не больше трех — жить будет.

RO>Элементарно.


RO>C++98, C++03:

RO>
RO>HelloSutter& HelloSutter::operator =(HelloSutter other)
RO>{
RO>    swap(other);
RO>    return *this;
RO>}
RO>

RO>C++09:
RO>
RO>HelloSutter& HelloSutter::operator =(HelloSutter other)
RO>{
RO>    return *this = std::move(other);
RO>}
RO>



Течёт вода Кубань-реки куда велят большевики.
Re[9]: придумайте умный вопрос по с++
От: OdesitVadim Украина  
Дата: 16.08.07 13:40
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, OdesitVadim, Вы писали:


E>>>>>Надо ещё что-то типа stdlib включить, чтобы exit( int ) таки была

OV>>>>Да, если добавить #include <stdlib.h>, то ничего не выведет. Но заметье, что в исходной задаче об этом ни слова.
E>>>Ну там и про std::cout тоже ни слова
OV>>Не понял юмора.
E>Ну в вопросе было и std::cout и exit.
E>Для одного ты include написал, а для другого нет. Интересно почему?
А с чего взято, что я не написал? всё написано. #include <stdlib.h> предложили люди позже, что бы заставить работать пример по другому.
а #include <iostream> я написал сразу, как увидел std. без него то не компилиться.
Сложно говорить, что выведет пример, елси он не компилиться. Может с этого и начать?
"Пример не компилиться, автор недодумал вопрос, всем ...".
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re[8]: придумайте умный вопрос по с++
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 16.08.07 13:46
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>Решив дома я пришёл к ним на следующий день и сказал, что знаю решение. На что они ответили, что не против его получить, так как над решением бьются сами не первый день. Ответ был прост — перепроектировать всё (типичный для словянского менталитета. И обяснил им о глюках. Роботу предлагали, но я уже отказался. Не могу, когда мной командует человек, который неумеет ставить задачки.




Напомнило пару историй.

Первая — судя по легендам о МФТИ, там на вступительных дают задачи, которые в не могли решить профессора/аспиранты

А вторая — у меня есть друг "детства" (башка как компьютер, но программированием он не занимается). Играл в преф с тремя субъектами. Заявил 8 взяток. Потом взял прикуп (2 туза, кажется) и бросил его в морду раздающему. И, наконец, сыграл как 10, просадив двух других, которые решили вистовать
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Давайте проверим?
От: Roman Odaisky Украина  
Дата: 16.08.07 13:48
Оценка:
Здравствуйте, Smal, Вы писали:

S>rbegin/rend ?


Ну примерно. А если вторая функция упорно требует std::string const &, а не Iterator, Iterator?
До последнего не верил в пирамиду Лебедева.
Re[4]: придумайте умный вопрос по с++
От: Roman Odaisky Украина  
Дата: 16.08.07 13:54
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>>>Попроси оператор присваивания написать вот для такого обьекта:

A>>>class Struct
A>>>{ int *Massiv1,*Massiv2 ;
A>>>};

A>>>Если тебе не нравятся массивы, заданные указателем, сделай вектора.


RO>>Так если вектора, то ничего не нужно писать вообще, дефолтный оператор справится.


A>Или я чего-то не понимаю, или ты не прошел тест. :)

A>Что произойдет, если первый массив скопировался, а на второй не хватило памяти?

Исключение и basic exception guarantee.

A>>>А дальше смотри что будет:

A>>>1) Догадается ли он проверить на тождественность обьектов.
A>>>2) Освободить память присваиваемого обьекта.
A>>>3) Поймать все исключения.
A>>>4) Отловить все ситуации, когда под один массив память захватилась, а под другой нет.
A>>>5) Корректно откатить ситуацию п 4. не повредив обьект.
A>>>6) Не будет ли течь память во всяких ситуациях

RO>>п. 3 — ???


A>что делает new при нехватке памяти?


Кидается. Но зачем их ловить-то? Их надо дальше передавать. Вот тебе strong exception guarantee без catch:
RO>>
HelloSutter& HelloSutter::operator =(HelloSutter other)
{
    swap(other);
    return *this;
}
До последнего не верил в пирамиду Лебедева.
Re[10]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 16.08.07 13:54
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>а #include <iostream> я написал сразу, как увидел std. без него то не компилиться.

да он впроде и без stdlib не должен на совместимом компиляторе...

Но я согласен, что на собеседовании лучше включить в пример оба инклюда и void тоже стоит написать перед ToDo
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: придумайте умный вопрос по с++
От: Vintik_69 Швейцария  
Дата: 16.08.07 14:00
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Или я чего-то не понимаю, или ты не прошел тест.

A>Что произойдет, если первый массив скопировался, а на второй не хватило памяти?

Программа рухнет с bad_alloc. По-моему, нормально . А то абсолютно везде проверять на наличие памяти — это рехнуться можно, и смысла не видно.
Re[3]: придумайте умный вопрос по с++
От: Константин Л. Франция  
Дата: 16.08.07 14:03
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Константин Л., Вы писали:


КЛ>>а кожалению, так не бывает. Либо ты задаешь конкретные вопросы по языку, либо вообще абстрагируясь от конкретного языка.

E>Почему? С++ довольно логично устроен, вообще-то.

для постороения этой логики нужны как раз те самые знания

КЛ>>По языку всегда интересны вопросы про templates, poi, spicialization/overriding.

E>Я бы их не стал задавать. Но у моих подчинённых и использование своих шаблонов запрещенно...

И чем тут гордиться?

КЛ>>1.

КЛ>>//Why this code "works" fine and outs "Hello, world!"

E>Потому что UB может быть и таким? Или ты какой ответ расчитываешь получить?


Хочу услышать в ответ представления с++ объектов в памяти. Точнее, чувак должен связать это представление и данное поведение.

КЛ>>2.

КЛ>>//What function will be called in *1*?
E>Ты бы хоть вывод разный в разных функциях сделал...

зачем?

E>А в целом хотелось бы понять что тут такого "умного" и зачем это всё надо при работе?


Понимание что такое templates, overloading.

E>Вообще засчем так программировать, что зависишь от типа литерала
10


я говорил что надо так? Надо понимать, что должно происходить в данном случае, и что при прочих равных компайлер всегда выберет нешаблонную функцию

КЛ>>3.

E>Вопроса нет
E>Нужно догадаться, что хотел спросить автор? Типа "будет ли компилироваться код?"
E>ИМХО так тоже не стоит прогать. Соответственно не понятно хорошо ли то, что кандидат умеет искать такие ошибки
E>

E>Тогда уж вот тебе вопрос, в коллекцию:

E>
E>class CMyOps {
E>public:
E>    void exit( int code ) { std::cout << "Exit code: " << code << std::endl; }

E>};

E>template<class T>
E>class CMyProcessor : T {
E>public:
E>    ToDo() { exit( 1 ); }
E>};

E>int main()
E>{
E>    CMyProcessor<CMyOps> p;
E>    p.ToDo();
E>    std::cout << "All right!!!" << std::endl;
E>}


E>Что напечатает эта программа?


тут просматривается ворос на 2 phase name lookup. Вроде как должна вызваться ::exit.

В любом случае, вариантов 2:

а) 2pnl не работает — пытаемся вызвать CMyOps::exit, но тк у нас private наследование, то не скомпилируется
б) 2pnl работает — вызовется ::exit
Re[3]: глупый, но логически выводимый
От: Roman Odaisky Украина  
Дата: 16.08.07 14:18
Оценка:
Здравствуйте, Erop, Вы писали:

E>>1) Какие соглашения о вызове совместимы с функциями с переменным числом параметров (которые ...)?

E>>ИМХО этот вопрос задавать на собеседовании глупо

wtf «соглашения о вызове»? ISO 14882:2003 такого не знает.

E>>2) Если я заключу кусок кода в
extern "c" {
тут код
}
, то что-нибудь в коде поменяется?


E>Прикольно, что никто е пробует отвечать... :)


Поменяется.
До последнего не верил в пирамиду Лебедева.
Re[4]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 16.08.07 14:19
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>>>а кожалению, так не бывает. Либо ты задаешь конкретные вопросы по языку, либо вообще абстрагируясь от конкретного языка.

E>>Почему? С++ довольно логично устроен, вообще-то.
КЛ>для постороения этой логики нужны как раз те самые знания
Обычно нужны другие, чем для ответов на хитрые вопросы...

КЛ>>>По языку всегда интересны вопросы про templates, poi, spicialization/overriding.

E>>Я бы их не стал задавать. Но у моих подчинённых и использование своих шаблонов запрещенно...
КЛ>И чем тут гордиться?
ИМХО гордиться надо не использованием шаблонов, или неиспользованием, а тем, что мы первые там или вторые в мире по качеству решания нашей задачи, что нашей прогой пользуются десятки миллионов человек, и тому подобными вещами.
А шаблоны запрещены по делу. Пока что контрпримеров не было. Тем более, что если они таки нужны, то их для этого конкретного дела разрешают. Правда на самом деле они нужны редко


КЛ>Хочу услышать в ответ представления с++ объектов в памяти. Точнее, чувак должен связать это представление и данное поведение.

Вообще-то никто не гарантирует, что всегда всё будет так. Главное чего я не понимаю, почему тебе кажется что такой ответ важен для кандидата...

E>>Ты бы хоть вывод разный в разных функциях сделал...

КЛ>зачем?
ЧТобы можно было спорить аргументированно.

E>>ИМХО так тоже не стоит прогать. Соответственно не понятно хорошо ли то, что кандидат умеет искать такие ошибки

В целом опыт в поиске таких ошибок говорит либо о большом опыте вообще, либо о том, что кандидат именно так и программирует...

E>>

КЛ>тут просматривается ворос на 2 phase name lookup. Вроде как должна вызваться ::exit.
Угу. Она.

КЛ>В любом случае, вариантов 2:


КЛ>а) 2pnl не работает — пытаемся вызвать CMyOps::exit, но тк у нас private наследование, то не скомпилируется

А вот с этого места, пожалуйста, поподробнее...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: глупый, но логически выводимый
От: Erop Россия  
Дата: 16.08.07 14:25
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Erop, Вы писали:


E>>>1) Какие соглашения о вызове совместимы с функциями с переменным числом параметров (которые ...)?

E>>>ИМХО этот вопрос задавать на собеседовании глупо

RO>wtf «соглашения о вызове»? ISO 14882:2003 такого не знает.

__cdecl например. Слышал такое слово?


E>>>2) Если я заключу кусок кода в
extern "c" {
тут код
}
, то что-нибудь в коде поменяется?


E>>Прикольно, что никто е пробует отвечать...


RO>Поменяется.

А что именно?
В смысле в семантике самого кода?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Давайте проверим?
От: Smal Россия  
Дата: 16.08.07 14:33
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Smal, Вы писали:


S>>rbegin/rend ?


RO>Ну примерно. А если вторая функция упорно требует std::string const &, а не Iterator, Iterator?

В эависимости от того как первая возвращает значение.
С уважением, Александр
Re[5]: придумайте умный вопрос по с++
От: Константин Л. Франция  
Дата: 16.08.07 14:40
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Константин Л., Вы писали:


КЛ>>>>а кожалению, так не бывает. Либо ты задаешь конкретные вопросы по языку, либо вообще абстрагируясь от конкретного языка.

E>>>Почему? С++ довольно логично устроен, вообще-то.
КЛ>>для постороения этой логики нужны как раз те самые знания
E>Обычно нужны другие, чем для ответов на хитрые вопросы...

тут мне нечего сказать. Логику строить надо на чем то. Обычно её строят на знаниях

КЛ>>>>По языку всегда интересны вопросы про templates, poi, spicialization/overriding.

E>>>Я бы их не стал задавать. Но у моих подчинённых и использование своих шаблонов запрещенно...
КЛ>>И чем тут гордиться?
E>ИМХО гордиться надо не использованием шаблонов, или неиспользованием, а тем, что мы первые там или вторые в мире по качеству решания нашей задачи, что нашей прогой пользуются десятки миллионов человек, и тому подобными вещами.

это понятно

E>А шаблоны запрещены по делу. Пока что контрпримеров не было. Тем более, что если они таки нужны, то их для этого конкретного дела разрешают. Правда на самом деле они нужны редко


ну если конечно в команде есть ацкий любитель шаблонов, пихающий их куда попало...

КЛ>>Хочу услышать в ответ представления с++ объектов в памяти. Точнее, чувак должен связать это представление и данное поведение.

E>Вообще-то никто не гарантирует, что всегда всё будет так. Главное чего я не понимаю, почему тебе кажется что такой ответ важен для кандидата...

Конечно не всегда. Тут UB. Важно, чтобы он знал, что this идет как скрытый аргумент методов класса.

E>>>Ты бы хоть вывод разный в разных функциях сделал...

КЛ>>зачем?
E>ЧТобы можно было спорить аргументированно.

А тут и без этого можно.

E>>>ИМХО так тоже не стоит прогать. Соответственно не понятно хорошо ли то, что кандидат умеет искать такие ошибки

E>В целом опыт в поиске таких ошибок говорит либо о большом опыте вообще, либо о том, что кандидат именно так и программирует...

Опыт в поиске ошибок говорит о знаниях, которые не бывают лишними.

E>>>

КЛ>>тут просматривается ворос на 2 phase name lookup. Вроде как должна вызваться ::exit.
E>Угу. Она.

КЛ>>В любом случае, вариантов 2:


КЛ>>а) 2pnl не работает — пытаемся вызвать CMyOps::exit, но тк у нас private наследование, то не скомпилируется

E>А вот с этого места, пожалуйста, поподробнее...



template<class T>
class CMyProcessor : T {
public:
    ToDo() { exit( 1 ); }
};


По дэфолту наследование private когда не указан спецификатор доступа, соотв. СMyOps::exit становится private для CMyprocessor. Или protected? кароче, забыл

А вопрос хороший
Re[6]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 16.08.07 14:52
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>ну если конечно в команде есть ацкий любитель шаблонов, пихающий их куда попало...

Ну однажды был и такой.
Но в целом в конторе очень много разработок, весьма наукоёмких. За всеми-то не уследишь, а рефакторинг потом дорогой.
Ещё правда помогает то, что STL не используется. Используется своя библиотека контейнеров.

КЛ>Опыт в поиске ошибок говорит о знаниях, которые не бывают лишними.

Ну мой вот опыт показал мне, что бывают люди которые хорошо знают всякие ж-ы, потому что при программировании из них не вылазят

Просто опыт и знания можно как-то более прямо проверить, ИМХО

E>>>>

КЛ>>>а) 2pnl не работает — пытаемся вызвать CMyOps::exit, но тк у нас private наследование, то не скомпилируется
E>>А вот с этого места, пожалуйста, поподробнее...


КЛ>

КЛ>template<class T>
КЛ>class CMyProcessor : T {
КЛ>public:
КЛ>    ToDo() { exit( 1 ); }
КЛ>};

КЛ>


КЛ>По дэфолту наследование private когда не указан спецификатор доступа, соотв. СMyOps::exit становится private для CMyprocessor. Или protected? кароче, забыл


То есть
struct CXXX { void out() { std::cout << "XXX"; } };
class CMy : CXXX {
public:
    void ToDo() { out(); }
};
не скомпилируется?

Короче, если ты думаешь про себя, что ты хороший спец, то вот такой формальный "экзамен на зания" ты только что провалил

А всё потому, что private наследование -- тоже маргинальщина.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: придумайте умный вопрос по с++
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 16.08.07 15:14
Оценка:
Здравствуйте, Erop, Вы писали:

E>То есть
struct CXXX { void out() { std::cout << "XXX"; } };
E>class CMy : CXXX {
E>public:
E>    void ToDo() { out(); }
E>};
не скомпилируется?


E>Короче, если ты думаешь про себя, что ты хороший спец, то вот такой формальный "экзамен на зания" ты только что провалил


E>А всё потому, что private наследование -- тоже маргинальщина.

Интересно, и как такими ... вопросами можно определить — приличный программист на плюсах или нет?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[7]: придумайте умный вопрос по с++
От: Awaken Украина  
Дата: 16.08.07 15:26
Оценка: +1
E>Короче, если ты думаешь про себя, что ты хороший спец, то вот такой формальный "экзамен на зания" ты только что провалил
E>А всё потому, что private наследование -- тоже маргинальщина.

у нас стандартом кодирования запрещены :
-множественное наследование реализации
-виртуальные базы
-приватное наследование
но на интервью часто спрашивают как раз про всякую такую хрень
и еще про vector<bool> до кучи , который я бы тоже запретил
Re[8]: придумайте умный вопрос по с++
От: remark Россия http://www.1024cores.net/
Дата: 16.08.07 15:33
Оценка: 1 (1) :))
Здравствуйте, Awaken, Вы писали:

A>у нас стандартом кодирования запрещены :

A>-множественное наследование реализации
A>-виртуальные базы
A>-приватное наследование

А вы случаем не на C#/Java программируете?
Если нет, то попробуйте


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[8]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 16.08.07 15:55
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Интересно, и как такими ... вопросами можно определить — приличный программист на плюсах или нет?

ИМХО никак нельзя
Просто Константину такие нравятся, вот я ему ищё один и придумал.

Хотя, как это ни прикольно, обсуждая тут этот вопрос многие люди прокололись по каким-то маргинальным вещам. Кто-то забыл про функцию exit, кто-то о правилах privte наследования...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: придумайте умный вопрос по с++
От: Константин Л. Франция  
Дата: 16.08.07 17:09
Оценка:
Здравствуйте, Awaken, Вы писали:

E>>Короче, если ты думаешь про себя, что ты хороший спец, то вот такой формальный "экзамен на зания" ты только что провалил

E>>А всё потому, что private наследование -- тоже маргинальщина.

A>у нас стандартом кодирования запрещены :

A>-множественное наследование реализации

тут, конечно, надо буть осторожным

A>-виртуальные базы


хм... Это что?

A>-приватное наследование


Конечно можно заменить делегированием, но на запрет не тянет

A>но на интервью часто спрашивают как раз про всякую такую хрень

A>и еще про vector<bool> до кучи , который я бы тоже запретил

+1
Re[7]: придумайте умный вопрос по с++
От: Константин Л. Франция  
Дата: 16.08.07 17:13
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Константин Л., Вы писали:


КЛ>>ну если конечно в команде есть ацкий любитель шаблонов, пихающий их куда попало...

E>Ну однажды был и такой.
E>Но в целом в конторе очень много разработок, весьма наукоёмких. За всеми-то не уследишь, а рефакторинг потом дорогой.
E>Ещё правда помогает то, что STL не используется. Используется своя библиотека контейнеров.

это настораживает. Хотя может быть специфика.

КЛ>>Опыт в поиске ошибок говорит о знаниях, которые не бывают лишними.

E>Ну мой вот опыт показал мне, что бывают люди которые хорошо знают всякие ж-ы, потому что при программировании из них не вылазят

))). Люди бывают разные

E>Просто опыт и знания можно как-то более прямо проверить, ИМХО


ага

[]

КЛ>>По дэфолту наследование private когда не указан спецификатор доступа, соотв. СMyOps::exit становится private для CMyprocessor. Или protected? кароче, забыл


E>То есть
struct CXXX { void out() { std::cout << "XXX"; } };
E>class CMy : CXXX {
E>public:
E>    void ToDo() { out(); }
E>};
не скомпилируется?


E>Короче, если ты думаешь про себя, что ты хороший спец, то вот такой формальный "экзамен на зания" ты только что провалил


1. я бы не стал задавать такой вопрос.
2. Я бы не стал на него отвечать
3. Я бы не принимал во внимание правильность ответа на него

E>А всё потому, что private наследование -- тоже маргинальщина.


Насколько я помню из курса социологии, маргинальщина по определению не делает какие-то вещи плохими. Она делает их редкими.
Re[5]: глупый, но логически выводимый
От: Roman Odaisky Украина  
Дата: 16.08.07 17:24
Оценка:
Здравствуйте, Erop, Вы писали:

E>>>>1) Какие соглашения о вызове совместимы с функциями с переменным числом параметров (которые ...)?

E>>>>ИМХО этот вопрос задавать на собеседовании глупо

RO>>wtf «соглашения о вызове»? ISO 14882:2003 такого не знает.

E>__cdecl например. Слышал такое слово?

Я слышал, Рихтер слышал, Страуструп — нет. Речь вроде о C++, не о конкретных его реализациях.

E>>>>2) Если я заключу кусок кода в
extern "c" {
тут код
}
, то что-нибудь в коде поменяется?


RO>>Поменяется.


E>А что именно?

E>В смысле в семантике самого кода?

Implementation-defined, потому что реализации обязаны поддерживать только extern "C" и extern "C++" :-)

extern "C" позволяет использовать функции C в C++, или наоборот. Обычно extern "C" отключает C++ name mangling со всеми вытекающими последствиями. Любопытно, что это не помешает объявлять операторы, но только по одному разу.
До последнего не верил в пирамиду Лебедева.
Re[8]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 16.08.07 17:33
Оценка:
Здравствуйте, Константин Л., Вы писали:

E>>Ещё правда помогает то, что STL не используется. Используется своя библиотека контейнеров.

КЛ>это настораживает. Хотя может быть специфика.
Ну тут уже было недавно обсуждение минусов STL
У нас есть всё нужное "ещё с той войны", когда STL только изобретали. Теперь переходить на него толку никакого. Кроме того к нему есть ряд серьёзных претензий.
Короче у нас реально крутая IT контора с очень большим опытом разработок. Так что проверено на опыте -- STL не главное.

E>>А всё потому, что private наследование -- тоже маргинальщина.


КЛ>Насколько я помню из курса социологии, маргинальщина по определению не делает какие-то вещи плохими. Она делает их редкими.


Ну да, имеено поэтому реальные перцы, которые работают, а не ботают стандарт наизусть в маргинальных вещв
ах обычно плавают.

На всяк случай. public и protected члены private базы наследуются как private члены.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: глупый, но логически выводимый
От: Erop Россия  
Дата: 16.08.07 17:36
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

E>>>>>1) Какие соглашения о вызове совместимы с функциями с переменным числом параметров (которые ...)?

E>>>>>ИМХО этот вопрос задавать на собеседовании глупо

E>>__cdecl например. Слышал такое слово?

RO>Я слышал, Рихтер слышал, Страуструп — нет. Речь вроде о C++, не о конкретных его реализациях.
речь о вопросах на собеседовании. Еслитебе трудно так общё, то можно обсудить gcc или VS



RO>extern "C" позволяет использовать функции C в C++, или наоборот. Обычно extern "C" отключает C++ name mangling со всеми вытекающими последствиями. Любопытно, что это не помешает объявлять операторы, но только по одному разу.

Ну почти угадал. extern "C" функции в глобальном namespace не могут быть перегружены. Именно до этого и можно дойти логическими рассуждениями
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: придумайте умный вопрос по с++
От: Константин Л. Франция  
Дата: 16.08.07 17:40
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Константин Л., Вы писали:


E>>>Ещё правда помогает то, что STL не используется. Используется своя библиотека контейнеров.

КЛ>>это настораживает. Хотя может быть специфика.
E>Ну тут уже было недавно обсуждение минусов STL
E>У нас есть всё нужное "ещё с той войны", когда STL только изобретали. Теперь переходить на него толку никакого. Кроме того к нему есть ряд серьёзных претензий.
E>Короче у нас реально крутая IT контора с очень большим опытом разработок. Так что проверено на опыте -- STL не главное.

ни кто и не сомневался

E>>>А всё потому, что private наследование -- тоже маргинальщина.


КЛ>>Насколько я помню из курса социологии, маргинальщина по определению не делает какие-то вещи плохими. Она делает их редкими.


E>Ну да, имеено поэтому реальные перцы, которые работают, а не ботают стандарт наизусть в маргинальных вещв

E>ах обычно плавают.

а совсем реальные перцы делают и то и то. Но их мало.
Re[6]: придумайте умный вопрос по с++
От: Аноним  
Дата: 16.08.07 17:48
Оценка: -3
Здравствуйте, Константин Л., Вы писали:

КЛ>Важно, чтобы он знал, что this идет как скрытый аргумент методов класса.


Практически бесполезное знание неких деталей реализации,
которое в общем-то не нужно при программировании C++

Зачем это нужно, за исключением грязных хаков?
Re: О собеседоваиях
От: Erop Россия  
Дата: 16.08.07 18:54
Оценка:
Здравствуйте, Awaken, Вы писали:

A>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"


ИМХО на собеседовании важнее всего не вопросы, а стратегия и ясное понимание целей и задач мероприятия
Собственно всё дальше только моё ИМХО и подходит наверное только для большой конторы

1) Икать надо людей способных быть хорошими программистами, а не изучивших что-то конкртеное. ИМХО личные качества и способности намного важнее знаний. Правда знания тоже очень важны, но никакие знания не компинсируют отсутсвие способностей. С другой стороны любые зания дело наживное.

2) Реальные качества программиста можно понять только за испытательный срок, а не во время собесдования.

Соответсвенно идеальный процесс лично мне представляется таким:

1) Собеседование. В результате решаем что
а) Кандидат и вы друг дургу не подходите
б) Кандидат подходит, но ему нужно подучиться
в) Кандидат подходит и вроде бы знает достаочно

В случае "в" надо назначать большой испытательный срок, в течении которого кандидат должен изучить то, чего ему не достаёт и подготовиться к работе в конторе. При этом он уже с какого-то момента исп. срока должен начать выполнять какие-то некритичные и несложные задачи.

В случае "б" надо уюедиться, что кандидат сможет перестроиться под принятые в конторе стандарты и назачить ему небольшой исп. срок в течении котрого обсудить с ним в форме экзамена-собеседования все нужные знания и технологии. Постепенно вводя его в работу. Если выяснится, что что-то он не знает сильно и не успевает/не может изучить, то поставить ему условие заботать и сдать это в течении какого-то доп. срока, уже без отрыва от производства.

Соответсвенно имеем три варианта собеседования.

1) Собственно стартовое собеседование
2) Экзамен-семинар для новичка
3) Экзамен-собеседование для чела с опытом

У всех трёх свои цели, задачи и, соответсвтенно, методы проведения
На стартовом собеседовании надо понять опыт кандидата, его общую математическую эрудицию, теоритические знания, уровень занния языка, библиотек, средств разработки. Выяснить личные качества и готовность принять ценнсоти, принятые в конторе.

Как-то так в общем
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: глупый, но логически выводимый
От: Roman Odaisky Украина  
Дата: 16.08.07 19:32
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Roman Odaisky, Вы писали:


E>>>>>>1) Какие соглашения о вызове совместимы с функциями с переменным числом параметров (которые ...)?

E>>>>>>ИМХО этот вопрос задавать на собеседовании глупо

E>>>__cdecl например. Слышал такое слово?

RO>>Я слышал, Рихтер слышал, Страуструп — нет. Речь вроде о C++, не о конкретных его реализациях.
E>речь о вопросах на собеседовании. Еслитебе трудно так общо, то можно обсудить gcc или VS :)

Насколько я помню, CDECL — аргументы кладутся на стек, который разбирает вызываемая функция, STDCALL (PASCAL) — тоже стек, но разбирает его вызывающая функция, и порядок аргументов у CDECL и STDCALL противоположный, и FASTCALL — аргументы в регистрах. Как-то так, надо будет — выгуглю. По идее, только CDECL умеет ..., но я не уверен.

E>

RO>>extern "C" позволяет использовать функции C в C++, или наоборот. Обычно extern "C" отключает C++ name mangling со всеми вытекающими последствиями. Любопытно, что это не помешает объявлять операторы, но только по одному разу.

E>Ну почти угадал. extern "C" функции в глобальном namespace не могут быть перегружены. Именно до этого и можно дойти логическими рассуждениями :)


А я о чем?

И всё равно забавно — extern "C" operator. В C++09 это будет запрещено, но пока можно.
До последнего не верил в пирамиду Лебедева.
Re[5]: Давайте проверим?
От: Roman Odaisky Украина  
Дата: 16.08.07 19:33
Оценка:
Здравствуйте, Smal, Вы писали:

RO>>Ну примерно. А если вторая функция упорно требует std::string const &, а не Iterator, Iterator?

S>В эависимости от того как первая возвращает значение.

std::string getSomeInterestingData();
До последнего не верил в пирамиду Лебедева.
Re[2]: О собеседоваиях
От: Roman Odaisky Украина  
Дата: 16.08.07 19:39
Оценка:
Здравствуйте, Erop, Вы писали:

E>ИМХО на собеседовании важнее всего не вопросы, а стратегия и ясное понимание целей и задач мероприятия

E>Собственно всё дальше только моё ИМХО и подходит наверное только для большой конторы

E>1) Икать надо людей способных быть хорошими программистами, а не изучивших что-то конкртеное. ИМХО личные качества и способности намного важнее знаний. Правда знания тоже очень важны, но никакие знания не компинсируют отсутсвие способностей. С другой стороны любые зания дело наживное.


E>2) Реальные качества программиста можно понять только за испытательный срок, а не во время собесдования.


E>Соответсвенно идеальный процесс лично мне представляется таким:


E>1) Собеседование. В результате решаем что

E>а) Кандидат и вы друг дургу не подходите
E>б) Кандидат подходит, но ему нужно подучиться
E>в) Кандидат подходит и вроде бы знает достаочно

Всё равно придется учиться/подстраиваться — это 100%.

Мне больше нравится подход Джоэла («The Guerrilla Guide to Interviewing») — чисто субъективно, я не специалист по кадрам.
До последнего не верил в пирамиду Лебедева.
Re[10]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 16.08.07 19:41
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>а совсем реальные перцы делают и то и то. Но их мало.

Опять же по опыту. Настолько реальные перцы обычно ценны безотносительно к знанию маргинальных вещей

Опять же у нас был опыт людей, которые реально всё-всё очень круто знали, но не могли решить довольно простые на мой взгляд задачи, за довольно большое время. пи этом не потому, что они былиглупые, или там неспособные. А как-то вот не тем занимались. ТО дельфи из C++ вызывали, то какую-то архитектурную конструёвину рожали, а реальных результатов не было, хотя делали всё время реально крутые вещи. Но ненужные
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: глупый, но логически выводимый
От: Erop Россия  
Дата: 16.08.07 19:45
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Насколько я помню, CDECL — аргументы кладутся на стек, который разбирает вызываемая функция, STDCALL (PASCAL) — тоже стек, но разбирает его вызывающая функция, и порядок аргументов у CDECL и STDCALL противоположный, и FASTCALL — аргументы в регистрах. Как-то так, надо будет — выгуглю. По идее, только CDECL умеет ..., но я не уверен.


Ну где-то так примено. Общая идея такая, что можно передать только по такому соглашени о вызове, когда стек чистит вызывающая сторона. Это довольно принципиалное требование, ИМХО, и до него тоже можно дойти логическим путём.
Грубо говоря ответ на этот вопрос до какой-то степени демонстрирует понимание кандидатом "как устроен С++"

E>>

RO>А я о чем?
Ну я так и понял. Я бы твой ответ зачёл, так скажем. Просто тут ведь разные люди форум читают. Некоторрые могли твой ответ не расшифровать

RO>И всё равно забавно — extern "C" operator. В C++09 это будет запрещено, но пока можно.

Ну да, но это маргинальщина, ИМХО. Я бы, наоборот, отменил действие extern "C" на операторы
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Давайте проверим?
От: Erop Россия  
Дата: 16.08.07 19:46
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>
std::string getSomeInterestingData();


Ну типа copy пззвать от rbegin rend?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: О собеседоваиях
От: Erop Россия  
Дата: 16.08.07 19:55
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Всё равно придется учиться/подстраиваться — это 100%.

Ну так поэтому и нужен испытательный срок с экзаменом-собеседованием-обсуждением всего что нужно для работы даже для знающего сотрудника.
У нас, например, он обычно равен месяцу.

RO>Мне больше нравится подход Джоэла («The Guerrilla Guide to Interviewing») — чисто субъективно, я не специалист по кадрам.


А коротко не перескажешь? А то долго читать, сейчас не затяну
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: придумайте умный вопрос по с++
От: alexeiz  
Дата: 16.08.07 22:10
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, alexeiz, Вы писали:


A>>- Как реализовать Singleton?


RO>Я уже представляю, что будет, если на это собеседование придет IB.


Будет интересная беседа. Целью этого вопроса не является получить заранее предопределенный ответ. Если человек считает, что применение этого паттерна не оправдано, и может это грамотно объяснить, то он "пройдет" мое собеседование. Но я все равно попрошу его показать, как паттерн реализуется на C++ .

Фишка вопроса (как и всех, которые я задаю на интервью) в том, что он предпологает беседу. Вопрос задается кратко. Он недоформулирован. Человек начинает додумывать: какие требования, где применяется, и т.д. — мыслить вслух. Его можно направлять, т.е. сказать: "давайте возьмем вот этот случай". Я заранее предпологаю некоторый план, по которому может развиваться беседа. Иногда бывает так, что человек "забегает вперед". Т.е. он сразу начинает обсуждать проблемы, о которых я только собрался его спросить. Это большой плюс.

Мне очень понравился подход Joel Spolsky, и я взял его на вооружение. От человека на интервью требуется показать две вещи. Что он: 1) smart, 2) gets things done. Я считаю, что это можно в какой-то мере выяснить, наблядая, как он подходит к задаче, не имеющей законченного или предопределенного решения.
Re[2]: придумайте умный вопрос по с++
От: landerhigh Пират  
Дата: 16.08.07 23:52
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>1. По алгоритмической сложности (не совсем C++, но рядом). Тестируемому предлагается выражениие: O(log(N)). Большинство претендентов без затруднений рассказывают, что это означает. После этого следует провокационный вопрос: "а логарифм здесь по какому основанию?" — вот тут зачастую можно повеселиться

Хм.. а ведь и правда с подковыркой.
С одной стороны, это качественная оценка, где важен скорее сам факт присутствия логарифма, чем его основание.
С другой стороны, основание-то тоже не с потолка взялось...
www.blinnov.com
Re[7]: Давайте проверим?
От: Smal Россия  
Дата: 17.08.07 05:58
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Roman Odaisky, Вы писали:


RO>>
std::string getSomeInterestingData();


E>Ну типа copy пззвать от rbegin rend?

Не модно копировать в данном случае. Лучше std::reverse (Не увеличивает память)
С уважением, Александр
Re[3]: придумайте умный вопрос по с++
От: rg45 СССР  
Дата: 17.08.07 07:08
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>Здравствуйте, rg45, Вы писали:


R>>1. По алгоритмической сложности (не совсем C++, но рядом). Тестируемому предлагается выражениие: O(log(N)). Большинство претендентов без затруднений рассказывают, что это означает. После этого следует провокационный вопрос: "а логарифм здесь по какому основанию?" — вот тут зачастую можно повеселиться

L>Хм.. а ведь и правда с подковыркой.
L>С одной стороны, это качественная оценка, где важен скорее сам факт присутствия логарифма, чем его основание.
L>С другой стороны, основание-то тоже не с потолка взялось...
Просто когда мы говорим "логарифмическая сложность", то подразумеваем, что колическтво итераций алгоритма пропорционально логарифму от числа элементов. А, поскольку, логарифмы с разным основанием от одного и того же числа отличаются друг от друга постоянным множителем, то пропорциональнось сохраняется при переходе к любому основанию.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: хинт
От: Erop Россия  
Дата: 17.08.07 07:11
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>Здравствуйте, rg45, Вы писали:


R>>1. По алгоритмической сложности (не совсем C++, но рядом). Тестируемому предлагается выражениие: O(log(N)). Большинство претендентов без затруднений рассказывают, что это означает. После этого следует провокационный вопрос: "а логарифм здесь по какому основанию?" — вот тут зачастую можно повеселиться

L>С другой стороны, основание-то тоже не с потолка взялось...
На всякий случай напомню, что понятии O( f(x) ) таково, что при любом ненулевом коэффициенте K,

O( f( x ) ) =def= O( K f( x ) )

правда на кой про это спрашивать --
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Давайте проверим?
От: Erop Россия  
Дата: 17.08.07 07:12
Оценка:
Здравствуйте, Smal, Вы писали:

E>>Ну типа copy пззвать от rbegin rend?

S>Не модно копировать в данном случае. Лучше std::reverse (Не увеличивает память)

Ну я иак понял Романа, что он загадал какое-то двинутое решение
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Давайте проверим?
От: Smal Россия  
Дата: 17.08.07 07:19
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ну я иак понял Романа, что он загадал какое-то двинутое решение

Вроде как написать свой адаптер для стринга, возвращающий все данные задом-наперед, и подменить
им обычный стринг во второй функции с помощью #define.
С уважением, Александр
Re[4]: придумайте умный вопрос по с++
От: Аноним  
Дата: 17.08.07 07:55
Оценка:
R>Просто когда мы говорим "логарифмическая сложность", то подразумеваем, что колическтво итераций алгоритма пропорционально логарифму от числа элементов. А, поскольку, логарифмы с разным основанием от одного и того же числа отличаются друг от друга постоянным множителем, то пропорциональнось сохраняется при переходе к любому основанию.

Ну не совсем любое основание. Основание 1 негуманно с точки зрения математики, а в диапазоне (0;1) вообще хороший алгоритм — чем больше N, тем быстре работает)
Re[5]: придумайте умный вопрос по с++
От: rg45 СССР  
Дата: 17.08.07 08:07
Оценка:
Здравствуйте, <Аноним>, Вы писали:

R>>Просто когда мы говорим "логарифмическая сложность", то подразумеваем, что колическтво итераций алгоритма пропорционально логарифму от числа элементов. А, поскольку, логарифмы с разным основанием от одного и того же числа отличаются друг от друга постоянным множителем, то пропорциональнось сохраняется при переходе к любому основанию.


А>Ну не совсем любое основание. Основание 1 негуманно с точки зрения математики, а в диапазоне (0;1)

Поправка принимается.

А>вообще хороший алгоритм — чем больше N, тем быстре работает)

А N — это что?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[9]: Давайте проверим?
От: Roman Odaisky Украина  
Дата: 17.08.07 08:08
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ну я иак понял Романа, что он загадал какое-то двинутое решение :)


Не то чтобы.

Обычно (как я себе представляю) на задание «перевернуть строку» пишут, в лучшем случае, что-то вроде этого:
void simpleStrrev(char* const s) // тема UTF-8 не раскрыта
{
    char* p1 = s;
    char* p2 = s + strlen(s);
    while(p1 < p2)
    {
        std::swap(*p1++, *--p2);
    }

    // а здесь потерялся return s;
}

А ведь можно и strlen вызвать в цикле, и второй буфер создать в динамической памяти, и просто написать нерабочую программу :-)

Я так себе представляю, что на «правильном» собеседовании будет примерно такой диалог:
— Переверните строку.
— Зачем переворачивать? std::reverse_iterator просто пройдет по строке с другой стороны, сложность O(1).
— +1, но итераторы не подходят: нужно получить char *.
— Тогда std::reverse, зачем изобретать велосипед?
— +1, но напишите, пожалуйста, свою реализацию std::strrev, мы начитались Джоэла и хотим посмотреть, родились ли Вы с пониманием указателей и адресной арифметики.
— char* myStrrev(char*…

Вот что я имел в виду. Кстати, правильно реализовать std::reverse тоже не очень просто. Кто рискнет? :-)
До последнего не верил в пирамиду Лебедева.
Re[4]: О собеседоваиях
От: Sni4ok  
Дата: 17.08.07 08:14
Оценка:
Здравствуйте, Erop, Вы писали:

E>А коротко не перескажешь? А то долго читать, сейчас не затяну


коротко- если чувак знает что такое поинтеры и рекурсия- то он умный, и подходит на все 100
Re[4]: О собеседоваиях
От: Roman Odaisky Украина  
Дата: 17.08.07 08:27
Оценка: 6 (1)
Здравствуйте, Erop, Вы писали:

RO>>Всё равно придется учиться/подстраиваться — это 100%.

E>Ну так поэтому и нужен испытательный срок с экзаменом-собеседованием-обсуждением всего что нужно для работы даже для знающего сотрудника.
E>У нас, например, он обычно равен месяцу.

RO>>Мне больше нравится подход Джоэла («The Guerrilla Guide to Interviewing») — чисто субъективно, я не специалист по кадрам.


E>А коротко не перескажешь? А то долго читать, сейчас не затяну :(


Критерии Fog Creek нагло украдены у Microsoft:

Smart, and
Gets Things Done.

Т. е., мозги присутствуют, и руки растут из того места. Smart включает в себя тех, кто «write lisp compilers for fun, in a weekend, in Assembler for the Nintendo DS», GTD — способность брать на себя ответственность и доводить дела до конца. Джоэл считает, что следует брать самых лучших, пусть это и стоит компании на порядок больше, чем небольшой батальон индусов, и вроде еще не разорился :-)

«I have never met anyone who can do Scheme, Haskell, and C pointers who can't pick up Java in two days, and create better Java code than people with five years of experience in Java, but try explaining that to the average HR drone».

А вообще, в той статье много букв, но (как ни странно) бо́льшая часть по делу, прочитай когда-нибудь.
До последнего не верил в пирамиду Лебедева.
Re[2]: придумайте умный вопрос по с++
От: Kubroid  
Дата: 17.08.07 08:28
Оценка: :))
Здравствуйте, Vzhyk, Вы писали:

V>Awaken пишет:

>>
>>
>> надо для собеседования
V>Вы бы сначала определились, что вам нужно от данного кандидата, а потом
V>вопросы сами придумаются.
необходимо показать кандидату что он ничерта не понимает и принять его с минимальной зп.
Re[8]: придумайте умный вопрос по с++
От: Roman Odaisky Украина  
Дата: 17.08.07 08:33
Оценка:
Здравствуйте, Awaken, Вы писали:

E>>Короче, если ты думаешь про себя, что ты хороший спец, то вот такой формальный "экзамен на зания" ты только что провалил :(

E>>А всё потому, что private наследование -- тоже маргинальщина.

A>у нас стандартом кодирования запрещены :

A>-множественное наследование реализации

class Impl: public Iface1, public Iface2?

A>-виртуальные базы


За что?

A>-приватное наследование


Тут понятно, за что — наверняка в 99% используют не по назначению — но если оно реально нужно?

A>но на интервью часто спрашивают как раз про всякую такую хрень

A>и еще про vector<bool> до кучи , который я бы тоже запретил

А ты вообще запрети std::vector, std::deque умеет всё то же, но лучше (разве что из std::deque<X> не получить X[]).
До последнего не верил в пирамиду Лебедева.
Re[10]: Давайте проверим?
От: Smal Россия  
Дата: 17.08.07 08:33
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Вот что я имел в виду. Кстати, правильно реализовать std::reverse тоже не очень просто. Кто рискнет?

А чего там думать?


template< class BidIter >
   void reverse( BidIter p, BidIter q )
{
   for( ; p != q && p != --q; ++p )
     std::swap(*p, *q);
}


Другое дело std::rotate. Его для разных категорий итераторов по-разному реализовать нужно.
С уважением, Александр
Re[11]: придумайте умный вопрос по с++
От: Roman Odaisky Украина  
Дата: 17.08.07 08:35
Оценка:
Здравствуйте, Erop, Вы писали:

E>Опять же у нас был опыт людей, которые реально всё-всё очень круто знали, но не могли решить довольно простые на мой взгляд задачи, за довольно большое время. пи этом не потому, что они былиглупые, или там неспособные. А как-то вот не тем занимались. ТО дельфи из C++ вызывали, то какую-то архитектурную конструёвину рожали, а реальных результатов не было, хотя делали всё время реально крутые вещи. Но ненужные :(


Вот это, в Джоэловых терминах, Smart, но не Get Things Done. Прочитай ту статью.
До последнего не верил в пирамиду Лебедева.
Re[3]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 17.08.07 10:14
Оценка:
Здравствуйте, Kubroid, Вы писали:

K>необходимо показать кандидату что он ничерта не понимает и принять его с минимальной зп.

А не боитесь, что нормальный человек просто уйдёт в другую контору?

Но в целом тогда вам вопросы про poi и двухфазный поиск имён, ровно как и про соглашение о вызовк функций с переменным числом аргументов очень даже подходят...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 17.08.07 10:16
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Вот это, в Джоэловых терминах, Smart, но не Get Things Done. Прочитай ту статью.

Ну как только времени наскребу, так сразу. Я её в 2read занёс
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: придумайте умный вопрос по с++
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 17.08.07 11:22
Оценка:
Здравствуйте, Erop, Вы писали:

K>>необходимо показать кандидату что он ничерта не понимает и принять его с минимальной зп.

E>А не боитесь, что нормальный человек просто уйдёт в другую контору?

E>Но в целом тогда вам вопросы про poi и двухфазный поиск имён, ровно как и про соглашение о вызовк функций с переменным числом аргументов очень даже подходят...


То есть, если человек не в курсе что такое "POI, двухфазный поиск имен и на соглашение на вызов функций с переменным числом аргументов и прочих вещей, о которых "должен знать эксперт по С++", то он уже лошара?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: О собеседоваиях
От: Awaken Украина  
Дата: 17.08.07 11:54
Оценка: 6 (1) -1
E>А коротко не перескажешь? А то долго читать, сейчас не затяну

есть на РСДН в статьях по русски:
http://www.rsdn.ru/article/career/interv.xml
Автор(ы): Джоэль Спольски (Joel Spolsky)
Re[8]: глупый, но логически выводимый
От: Awaken Украина  
Дата: 17.08.07 11:59
Оценка:
RO>Насколько я помню, CDECL — аргументы кладутся на стек, который разбирает вызываемая функция, STDCALL (PASCAL) — тоже стек, но разбирает >его вызывающая функция, и порядок аргументов у CDECL и STDCALL противоположный, и FASTCALL — аргументы в регистрах. Как-то так, надо >будет — выгуглю. По идее, только CDECL умеет ..., но я не уверен.
няз, это все верно только для PC/Intel архитектуры (и ряда других, например похожая на нее идеологически DEC/VAX)
в IBM/360 вообще стека не было, а параметры передавались через общую область памяти (в оном из регистров — база),
или вообще через регистры. наследники этой архитектуры до сих пор существуют, как и компиляторы C и C++ под нее.
как они там реализовали передачу переменного числа аргументов — хз. но это работает
Re[9]: придумайте умный вопрос по с++
От: Awaken Украина  
Дата: 17.08.07 12:01
Оценка:
RO>А ты вообще запрети std::vector, std::deque умеет всё то же, но лучше (разве что из std::deque<X> не получить X[]).

вектор запретить нельзя — он широко используется в интерфейсах с сишными функциями
Re[9]: придумайте умный вопрос по с++
От: Awaken Украина  
Дата: 17.08.07 12:03
Оценка:
E>У нас есть всё нужное "ещё с той войны", когда STL только изобретали. Теперь переходить на него толку никакого. Кроме того к нему есть ряд серьёзных претензий.
E>Короче у нас реально крутая IT контора с очень большим опытом разработок. Так что проверено на опыте -- STL не главное.

Microsoft?
Няз, именно в MS не используется STL (ну, кроме исследовательских и тестовых проектов. Greta ведь они написали,
а она сильно завязана на STL)
Re[7]: придумайте умный вопрос по с++
От: Awaken Украина  
Дата: 17.08.07 12:06
Оценка:
КЛ>>Важно, чтобы он знал, что this идет как скрытый аргумент методов класса.

А>Зачем это нужно, за исключением грязных хаков?


когда-нибудь писал перегруженные операторы присваивания?
Re[5]: О собеседоваиях
От: Константин Л. Франция  
Дата: 17.08.07 12:08
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

[]

RO>Т. е., мозги присутствуют, и руки растут из того места. Smart включает в себя тех, кто «write lisp compilers for fun, in a weekend, in Assembler for the Nintendo DS», GTD — способность брать на себя ответственность и доводить дела до конца. Джоэл считает, что следует брать самых лучших, пусть это и стоит компании на порядок больше, чем небольшой батальон индусов, и вроде еще не разорился


хоть я и согласен с его критериями, но вот это конкретный гон.

[]
Re[8]: придумайте умный вопрос по с++
От: Аноним  
Дата: 17.08.07 12:09
Оценка: :)
Здравствуйте, Awaken, Вы писали:

A>когда-нибудь писал перегруженные операторы присваивания?


Ну и где там нужно знание о скрытом аргументе методов класса?

Буду благодарен за пример, где это нужно.
Re[9]: придумайте умный вопрос по с++
От: Awaken Украина  
Дата: 17.08.07 12:35
Оценка:
А>Ну и где там нужно знание о скрытом аргументе методов класса?
А>Буду благодарен за пример, где это нужно.

не пойму ты всерьез или прикалываешься.
напиши код перегруженного оператора присваивания. это одна строчка
Re[10]: придумайте умный вопрос по с++
От: Аноним  
Дата: 17.08.07 14:20
Оценка:
Здравствуйте, Awaken, Вы писали:

А>>Ну и где там нужно знание о скрытом аргументе методов класса?

А>>Буду благодарен за пример, где это нужно.

A>не пойму ты всерьез или прикалываешься.

A>напиши код перегруженного оператора присваивания. это одна строчка

Не понимаю где там используется знание о скрытно передаваемом аргументе класса?
Или ты про то, что в методах класса можно пользоваться "this"?
И какое это имеет отношение к тому, что генерит компилятор?
В общем поясни, если не сложно...
Re[5]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 17.08.07 16:46
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>То есть, если человек не в курсе что такое "POI, двухфазный поиск имен и на соглашение на вызов функций с переменным числом аргументов и прочих вещей, о которых "должен знать эксперт по С++", то он уже лошара?


Ну всё от целей зависит...
Вот коллега Kubroid зачем-то хочет доказывать на собеседовании кандидатам, что они ничего не знают
Можно, кстати, и изящнее показывать, но лень писать всякие подколки.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 17.08.07 16:48
Оценка:
Здравствуйте, Awaken, Вы писали:

A>Microsoft?

Не скажу

Хотя на месте MS я бы из STL тоде не использовал
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: глупый, но логически выводимый
От: Erop Россия  
Дата: 17.08.07 16:50
Оценка:
Здравствуйте, Awaken, Вы писали:

A>или вообще через регистры. наследники этой архитектуры до сих пор существуют, как и компиляторы C и C++ под нее.

A>как они там реализовали передачу переменного числа аргументов — хз. но это работает

А всё равно очищать место под аргументы должна вызывающая сторона типа. Хотя можно себе представить стэковый фрейм, как блок памяти, который сам знает свой размер
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: Давайте проверим?
От: Roman Odaisky Украина  
Дата: 17.08.07 19:25
Оценка:
Здравствуйте, Smal, Вы писали:

RO>>Вот что я имел в виду. Кстати, правильно реализовать std::reverse тоже не очень просто. Кто рискнет? :-)

S>А чего там думать?

Во-во. 2 ошибки: для RAI можно оптимизировать сравнение (просто p < q), и вместо swap здесь лучше iter_swap. Зато не допустил третью — в некоторых реализациях STL перед swap нет std::, отчего срабатывает ADL с непредсказуемыми последствиями. Кстати, мало кто знает, что взятие имени функции в скобки отключает ADL. Вот так: (swap)(x, y).

S>
S>template< class BidIter >
S>   void reverse( BidIter p, BidIter q )
S>{
S>   for( ; p != q && p != --q; ++p )
S>     std::swap(*p, *q);
S>}
S>


S>Другое дело std::rotate. Его для разных категорий итераторов по-разному реализовать нужно.


Зачем rotate, лучший пример таких разных реализаций — lower_bound.
До последнего не верил в пирамиду Лебедева.
Re[5]: О собеседоваиях
От: Roman Odaisky Украина  
Дата: 17.08.07 19:26
Оценка:
Здравствуйте, Sni4ok, Вы писали:

E>>А коротко не перескажешь? А то долго читать, сейчас не затяну :(


S>коротко- если чувак знает что такое поинтеры и рекурсия- то он умный, и подходит на все 100


нет, на 50% — еще GTD :-)
До последнего не верил в пирамиду Лебедева.
Re[5]: О собеседоваиях
От: Roman Odaisky Украина  
Дата: 17.08.07 19:32
Оценка:
Здравствуйте, Awaken, Вы писали:

A>есть на РСДН в статьях по русски:

A>http://www.rsdn.ru/article/career/interv.xml
Автор(ы): Джоэль Спольски (Joel Spolsky)


И перевод нехороший, и текст устаревший.

Более-менее пристойный перевод на русский язык находится — сюрпрайз — на сайте Джоэла.

А вообще я не понимаю смысла в таких переводах. Толку от айтишника, который прочитал много умных книг и статей, но по-английски не понимает?
До последнего не верил в пирамиду Лебедева.
Re[5]: придумайте умный вопрос по с++
От: Roman Odaisky Украина  
Дата: 17.08.07 20:12
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>То есть, если человек не в курсе что такое "POI, двухфазный поиск имен и на соглашение на вызов функций с переменным числом аргументов и прочих вещей, о которых "должен знать эксперт по С++", то он уже лошара? :)


А если человек не в курсе, что такое о http://rsdn.ru/Info/rules.xml#EID?
До последнего не верил в пирамиду Лебедева.
Re[6]: придумайте умный вопрос по с++
От: Roman Odaisky Украина  
Дата: 17.08.07 20:14
Оценка:
Здравствуйте, rg45, Вы писали:

А>>вообще хороший алгоритм — чем больше N, тем быстре работает)

R>А N — это что?

Надо полагать, то, от чего O?

O(log N) = O(N²)
До последнего не верил в пирамиду Лебедева.
Re[5]: придумайте умный вопрос по с++
От: alpha21264 СССР  
Дата: 17.08.07 21:35
Оценка: -2 :)
Здравствуйте, Vintik_69, Вы писали:

V_>Здравствуйте, alpha21264, Вы писали:


A>>Или я чего-то не понимаю, или ты не прошел тест.

A>>Что произойдет, если первый массив скопировался, а на второй не хватило памяти?

V_>Программа рухнет с bad_alloc. По-моему, нормально . А то абсолютно везде проверять на наличие памяти — это рехнуться можно, и смысла не видно.


Вообще-то нормальные люди так и делают — проверяют ВЕЗДЕ на наличие памяти,
бросают исключения, ловят, сообщают пользователю, и сохраняют текущее состояние
данных до начала операции (транзакции).

Критерий профессионализма.

Течёт вода Кубань-реки куда велят большевики.
Re[5]: придумайте умный вопрос по с++
От: alpha21264 СССР  
Дата: 17.08.07 21:40
Оценка: -6 :))
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, alpha21264, Вы писали:


A>>>>Попроси оператор присваивания написать вот для такого обьекта:

A>>>>class Struct
A>>>>{ int *Massiv1,*Massiv2 ;
A>>>>};

A>>>>Если тебе не нравятся массивы, заданные указателем, сделай вектора.


RO>>>Так если вектора, то ничего не нужно писать вообще, дефолтный оператор справится.


A>>Или я чего-то не понимаю, или ты не прошел тест.

A>>Что произойдет, если первый массив скопировался, а на второй не хватило памяти?

RO>Исключение и basic exception guarantee.


1) Изясняйся по русски.
2) Что с ТВОИМИ данными будет?

A>>>>А дальше смотри что будет:

A>>>>1) Догадается ли он проверить на тождественность обьектов.
A>>>>2) Освободить память присваиваемого обьекта.
A>>>>3) Поймать все исключения.
A>>>>4) Отловить все ситуации, когда под один массив память захватилась, а под другой нет.
A>>>>5) Корректно откатить ситуацию п 4. не повредив обьект.
A>>>>6) Не будет ли течь память во всяких ситуациях

RO>>>п. 3 — ???


A>>что делает new при нехватке памяти?


RO>Кидается. Но зачем их ловить-то? Их надо дальше передавать. Вот тебе strong exception guarantee без catch:

RO>>>
RO>HelloSutter& HelloSutter::operator =(HelloSutter other)
RO>{
RO>    swap(other);
RO>    return *this;
RO>}
RO>


Ах! Какой ты умный!
1) Что такое swap? Я подозреваю, что это ОБМЕН переменных.
То есть твой "оператор присваивания" МЕНЯЕТ other.
2) Кто его писать будет?

Смеюсь и показываю пальцем.

3) Зачем вообще исключения ловят, передавали бы уж дальше, до самого exit.

Эта... Ты когда-нибудь работал? ВУЗ закончил?
Просто, если ты студент, то специально для тебя проведу ликбез.

Течёт вода Кубань-реки куда велят большевики.
Re[6]: придумайте умный вопрос по с++
От: jazzer Россия Skype: enerjazzer
Дата: 18.08.07 03:59
Оценка:
Здравствуйте, alpha21264, Вы писали:

RO>>Исключение и basic exception guarantee.


A>1) Изясняйся по русски.

А ты не знаешь, что такое exception guarantee, да? Как вариант: "гарантии безопасности исключений".

A>2) Что с ТВОИМИ данными будет?

basic exception guarantee ничего не говорит о данных, речь идет только об отсутствии утечек.

RO>>Кидается. Но зачем их ловить-то? Их надо дальше передавать. Вот тебе strong exception guarantee без catch:

RO>>>>
RO>>HelloSutter& HelloSutter::operator =(HelloSutter other)
RO>>{
RO>>    swap(other);
RO>>    return *this;
RO>>}
RO>>


A>Ах! Какой ты умный!

A>1) Что такое swap? Я подозреваю, что это ОБМЕН переменных.
A> То есть твой "оператор присваивания" МЕНЯЕТ other.
А если ты вглядишься в код, то увидишь, что other — это временный объект.

A>2) Кто его писать будет?

std::swap уже написан, загляни в стандарт на досуге. При желании можно специализировать для твоего класса.

A>Смеюсь и показываю пальцем.

Молодец

A>3) Зачем вообще исключения ловят, передавали бы уж дальше, до самого exit.

Вообще-то именно так и надо делать.
Просто exit для разных ситуаций разный.
А если ты ставишь try-catch в каждом месте, где может вылететь исключение...

Я вот интервьюировал одного индуса, так на вопрос "Что делать, если надо откатить состояние объекта при возникновении исключения?" он как раз и сказал: "Поставлю try-catch".
Я ему говорю: "Хорошо, а если у тебя 10 объектов, которые надо откатить?"
Он: "А в чем проблема? Поставлю 10 try-catch"

A>Эта... Ты когда-нибудь работал? ВУЗ закончил?

A>Просто, если ты студент, то специально для тебя проведу ликбез.

Похоже, это тебе ликбез нужен, раз ты понятия не имеешь о гарантиях безопасности исключений (ну и заодно и про п.5 обязательных правил RSDN).

P.S. Хотя давай, проведи ликбез. Очень интересно.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[11]: придумайте умный вопрос по с++
От: alexeiz  
Дата: 18.08.07 05:13
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Awaken, Вы писали:


A>>Microsoft?

E>Не скажу

E>Хотя на месте MS я бы из STL тоде не использовал


Что такое тоде из STL?
Re[6]: придумайте умный вопрос по с++
От: alexeiz  
Дата: 18.08.07 05:28
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Эта... Ты когда-нибудь работал? ВУЗ закончил?

A>Просто, если ты студент, то специально для тебя проведу ликбез.

Пожалуйте. Ликбез был бы очень к месту.
Re[3]: Три коммента и вопрос
От: Awaken Украина  
Дата: 18.08.07 10:06
Оценка: 1 (1)
E>А вообще-то три коммента у меня есть
E>1) Задавая "умный" вопрос стоит быть таки уверенным в его однозначном ответе. А то можно и опозорится

нмв наиболее интересные вопросы это "открытые" вопросы которые не имеют однозначно правильного ответа.
интересны такие вопросы которые предполагают логическую цепочку рассуждений, а не точное знание .
иначе бы просто выучил все возможные вопросы к собеседованиям, и пошел как на экзамен.
Re[6]: придумайте умный вопрос по с++
От: AndrewJD США  
Дата: 18.08.07 10:23
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Вообще-то нормальные люди так и делают — проверяют ВЕЗДЕ на наличие памяти,

A>бросают исключения, ловят, сообщают пользователю, и сохраняют текущее состояние
A>данных до начала операции (транзакции).

Расскажи, пожалуйста, что делают люди когда им не удалось создать простой объект по причине отсутствия памяти? Какие у них есть варианты.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[7]: придумайте умный вопрос по с++
От: Аноним  
Дата: 18.08.07 10:33
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Здравствуйте, alpha21264, Вы писали:


A>>Вообще-то нормальные люди так и делают — проверяют ВЕЗДЕ на наличие памяти,

A>>бросают исключения, ловят, сообщают пользователю, и сохраняют текущее состояние
A>>данных до начала операции (транзакции).

AJD>Расскажи, пожалуйста, что делают люди когда им не удалось создать простой объект по причине отсутствия памяти? Какие у них есть варианты.


Ты что не ПОНЯЛ? Они же бросают исключения, ловят, сообщают пользователю, и, вообще, сохраняют текущее состояние данных до начала операции (транзакции)! Подожди... Они сохраняют состояние после проверки на наличиа памяти или до? Блин, запутался...
Re[6]: придумайте умный вопрос по с++
От: Roman Odaisky Украина  
Дата: 19.08.07 15:31
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>>>>>Попроси оператор присваивания написать вот для такого обьекта:

A>>>>>Если тебе не нравятся массивы, заданные указателем, сделай вектора.
RO>>>>Так если вектора, то ничего не нужно писать вообще, дефолтный оператор справится.
A>>>Что произойдет, если первый массив скопировался, а на второй не хватило памяти?
RO>>Исключение и basic exception guarantee.

A>1) Изясняйся по русски.


Трудное это дело, когда термины придумываются на английском языке, а потом переводятся безграмотными переводчиками.

A>2) Что с ТВОИМИ данными будет?


http://en.wikipedia.org/wiki/Exception_handling#Exception_safety

Здесь не стоит заморачиваться потому, что на современных компьютерах памяти много, и кончается она редко. А если всё же кончается, то твоя программа переезжает в своп и начинает сильно-сильно тормозить, и никакие try — catch не помогут.

Хотя при желании можно реализовать strong exception guarantee, это я и делал ниже.

A>>>>>А дальше смотри что будет:

A>>>>>3) Поймать все исключения.
RO>>>>п. 3 — ???
A>>>что делает new при нехватке памяти?

RO>>Кидается. Но зачем их ловить-то? Их надо дальше передавать. Вот тебе strong exception guarantee без catch:

RO>>>>
RO>>HelloSutter& HelloSutter::operator =(HelloSutter other)
RO>>{
RO>>    swap(other);
RO>>    return *this;
RO>>}
RO>>


A>Ах! Какой ты умный!

A>1) Что такое swap? Я подозреваю, что это ОБМЕН переменных.
A> То есть твой "оператор присваивания" МЕНЯЕТ other. :)))

RTFM: swap(other) может обозначать AnyEnclosingNamespace::swap(other), а может и this->swap(other). Имелось в виду второе.

A>2) Кто его писать будет?


Тот же, кто и operator =. Выглядит он просто:
void HelloSutter::swap(HelloSutter& other)
{
    std::swap(member1, other.member1);
    std::swap(member2, other.member2);
    . . .
    std::swap(memberN, other.memberN);
}

// по вкусу:
namespace std
{
    void swap(HelloSutter& x, HelloSutter& y)
    {
        x.swap(y);
    }
}


A>Смеюсь и показываю пальцем.


A>3) Зачем вообще исключения ловят, передавали бы уж дальше, до самого exit.


Их ловят там, где можно обработать. Обработка точно не входит в юрисдикцию данного класса. Например:
try
{
    doc.saveAs(path); // вызвает много вспомогательных функций (и операторов)
}
catch(std::exception const& e)
{
    logEvent("Failed to save: " + e.what());
    blameUser("Throw away your computer, it can't save my file!");
}

Вот у меня встречное предложение.
class Storage
{
private:
    std::vector<X> xs_;
    std::deque<Y> ys_;
    std::list<Z> zs_;
};

Тот же вопрос: как написать operator =? Только давай строго сформулируем требования:

• Strong exception guarantee: или нет исключения и операция завершилась успешно, или есть исключение и класс не претерпел никаких изменений.
• Exception transparency: все исключения вылетают дальше без изменений, чтобы можно было обработать.
• Эффективность: отсутствие значительных затрат производительности на реализацию вышеперечисленного.

A>Эта... Ты когда-нибудь работал? ВУЗ закончил?

Да, нет.

A>Просто, если ты студент, то специально для тебя проведу ликбез.

Я крайне рад тому, что в этом отношении составляю компанию Андрею Александреску, поскольку имею возможность выслушать превосходную лекцию. Жду с нетерпением.
До последнего не верил в пирамиду Лебедева.
Re[5]: придумайте умный вопрос по с++
От: Alex Alexandrov США  
Дата: 19.08.07 18:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В дебажной версиях переменные нулем обычно инициализируются, а в релизе это не гарантированно. Я чаще всего сталкивался именно с этой проблемой.


Вообще-то, в дебаге область локальных переменных заполняется 0xCC, а не нулями.
It's kind of fun to do the impossible (Walt Disney)
Re: придумайте умный вопрос по с++
От: Alex Alexandrov США  
Дата: 19.08.07 18:26
Оценка:
Здравствуйте, Awaken, Вы писали:

A>-в каких ситуациях перегрузка левого ++ лучше чем правого ++?


Странный вопрос. Если уж перегружать, то оба... Еще бы меня насторожил экзаменатор, использующий термины "левый" и "правый" вместо "префиксный" и "постфиксный" соответственно.
It's kind of fun to do the impossible (Walt Disney)
Re: придумал (операторы)
От: Awaken Украина  
Дата: 19.08.07 19:05
Оценка:
в каком случае нужно определять перегруженный оператор как член класса,
а в каком френд функцию
или другой вариант вопроса: каким образом лучше перегрузить оператор XXX(любой на выбор)
Re[4]: Три коммента и вопрос
От: Erop Россия  
Дата: 19.08.07 19:29
Оценка: +1
Здравствуйте, Awaken, Вы писали:

E>>1) Задавая "умный" вопрос стоит быть таки уверенным в его однозначном ответе. А то можно и опозорится


A>нмв наиболее интересные вопросы это "открытые" вопросы которые не имеют однозначно правильного ответа.

A>интересны такие вопросы которые предполагают логическую цепочку рассуждений, а не точное знание .
A>иначе бы просто выучил все возможные вопросы к собеседованиям, и пошел как на экзамен.

Даже в этом случае ИМХО важно чтобы твои знания в этом вопросе сильно превосходили твоё невежество и амбиции...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 19.08.07 19:37
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Просто, если ты студент, то специально для тебя проведу ликбез.


Я не студент, н тоже с радостью бы послушал...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: верно читать так:
От: Erop Россия  
Дата: 19.08.07 19:42
Оценка:
E>Хотя на месте MS я бы из STL тоде не использовал
Хотя на месте MS я бы их STL тоже не использовал
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: О собеседоваиях
От: Erop Россия  
Дата: 19.08.07 19:56
Оценка: :))
Здравствуйте, Roman Odaisky, Вы писали:

RO>И перевод нехороший, и текст устаревший.

Мне стало так интересно, что я даже прочёл сегодня вечером оригинал и оба перевода. Что-то я грандиозных отличий не заметил

RO>А вообще я не понимаю смысла в таких переводах. Толку от айтишника, который прочитал много умных книг и статей, но по-английски не понимает?

1) По-английски можно понимать в разной степени
2) Разные людичитают местные форумы

А вообще в статье мне многое показалось своеобразным. Ну, например, любовь к написанию константы слева от сравнения в if'е. Или любовь к тому, чтобы при программировании ображения списка человек рисовал картинки. Скаежм я после этой статьи даже взял да и написал функцию, которая переворачивала односвязанный список. При этом я ничего нигде не рисовал и функция работала
Да и вообще много спорного. Хотя идеология более или менее разумная.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: придумайте умный вопрос по с++
От: Awaken Украина  
Дата: 19.08.07 19:56
Оценка: +1
RO>Здесь не стоит заморачиваться потому, что на современных компьютерах памяти много, и кончается она редко. А если всё же кончается, то твоя >программа переезжает в своп и начинает сильно-сильно тормозить, и никакие try — catch не помогут.

у Саттера кажется, было рассуждение по поводу нужно ли проверять ошибки распределения памяти в new. сводится оно примерно к следующему:
в системах с виртуальной памятью память "есть" всегда , если же ее нет то значит система в состоянии аварийного завершения.
единственное что тут можно сделать это записать ошибку в лог (что может тоже не сработать т.к. места на диске уже нет)
Re[2]: придумайте умный вопрос по с++
От: Awaken Украина  
Дата: 19.08.07 20:09
Оценка:
AA>Странный вопрос. Если уж перегружать, то оба... Еще бы меня насторожил экзаменатор, использующий термины "левый" и "правый" вместо "префиксный" и "постфиксный" соответственно.

вопрос звучал не про перегрузку а про использование.
если тебе не важен побочный эффект, то ++p будет эффективнее чем p++ т.к. не делается копия
Re[7]: О собеседоваиях
От: Awaken Украина  
Дата: 19.08.07 20:29
Оценка: +2
E>А вообще в статье мне многое показалось своеобразным. Ну, например, любовь к написанию константы слева от сравнения в if'е.

раньше так писал, сейчас перестал. имхо это должно решаться на уровне стандарта о кодировании.

>Или любовь к тому, чтобы при программировании ображения списка человек рисовал картинки. Скаежм я после этой статьи даже взял да и написал функцию, >которая переворачивала односвязанный список. При этом я ничего нигде не рисовал и функция работала

я всегда рисую , если задача непонятна. но списки настолько заезжены что можно сразу код писать.
один раз меня интервьюировал индус в Экспедии, я как раз писал на доске вставку в сортированный список. задача ерундовая,
но т.к. я волновался, то написал лишний ненужный if. потом он меня спросил — а можно ли сократить или оптимизировать код —
я поправил. правда в Экспедию меня все равно не взяли
Re[12]: Давайте проверим?
От: Smal Россия  
Дата: 20.08.07 07:20
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

S>>Другое дело std::rotate. Его для разных категорий итераторов по-разному реализовать нужно.


RO>Зачем rotate, лучший пример таких разных реализаций — lower_bound.


ИМХО, lower_bound пример упрощенный.
С другой стороны, этим он и хорош. Алгоритм очевиден, надо только правильно все оформить.
С уважением, Александр
Re[7]: придумайте умный вопрос по с++
От: Smal Россия  
Дата: 20.08.07 07:38
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

A>>Просто, если ты студент, то специально для тебя проведу ликбез.

RO>Я крайне рад тому, что в этом отношении составляю компанию Андрею Александреску, поскольку имею возможность выслушать превосходную лекцию. Жду с нетерпением.
Мне тоже очень хочется послушать эту лекцию Надеюсь подчерпнуть много нового.
С уважением, Александр
Re[6]: придумайте умный вопрос по с++
От: Roman Odaisky Украина  
Дата: 20.08.07 08:11
Оценка:
Здравствуйте, Alex Alexandrov, Вы писали:

А>>В дебажной версиях переменные нулем обычно инициализируются, а в релизе это не гарантированно. Я чаще всего сталкивался именно с этой проблемой.


AA>Вообще-то, в дебаге область локальных переменных заполняется 0xCC, а не нулями.


Вообще-то, кроме MSVS есть и более другие IDE.

Да и для MSVS всё не так просто: http://rsdn.ru/forum/message/1237078.1.aspx
Автор: Кодёнок
Дата: 23.06.05
До последнего не верил в пирамиду Лебедева.
Re[2]: придумал (операторы)
От: Roman Odaisky Украина  
Дата: 20.08.07 08:30
Оценка: 1 (1)
Здравствуйте, Awaken, Вы писали:

A>в каком случае нужно определять перегруженный оператор как член класса,

A>а в каком френд функцию
A>или другой вариант вопроса: каким образом лучше перегрузить оператор XXX(любой на выбор)

Вызов операторов-членов не применяет пользовательские преобразования типов к левому операнду, поэтому все симметричные операторы должны быть друзьями.
До последнего не верил в пирамиду Лебедева.
Re[8]: О собеседоваиях
От: Roman Odaisky Украина  
Дата: 20.08.07 08:55
Оценка: 1 (1) +1
Здравствуйте, Awaken, Вы писали:

E>>А вообще в статье мне многое показалось своеобразным. Ну, например, любовь к написанию константы слева от сравнения в if'е.

A>раньше так писал, сейчас перестал. имхо это должно решаться на уровне стандарта о кодировании.

Аналогично. Если пишешь if(1 == f()), то надо писать и if(2 != f()), и if(3 < f()), а это уже совсем некрасиво и непонятно.

>>Или любовь к тому, чтобы при программировании ображения списка человек рисовал картинки. Скаежм я после этой статьи даже взял да и написал функцию, >которая переворачивала односвязанный список. При этом я ничего нигде не рисовал и функция работала :)

A>я всегда рисую , если задача непонятна. но списки настолько заезжены что можно сразу код писать.

По-хорошему, приступая к задаче, нужно сперва ее обдумать с использованием карандаша и бумаги (мела и доски, и т. п.), а от компьютера держаться подальше. Если проект большой, то будет больше людей, больше умных слов вроде «Use case», «Workflow», «UML», но принцип тот же. Ведь цель собеседования в том, чтобы на примере простых задач показать и умение писать на таком-то ЯП, и умение решать задачи вообще, и, просто, свой подход к этому делу.
До последнего не верил в пирамиду Лебедева.
Re[9]: О собеседоваиях
От: Awaken Украина  
Дата: 20.08.07 09:14
Оценка:
RO>По-хорошему, приступая к задаче, нужно сперва ее обдумать с использованием карандаша и бумаги (мела и доски, и т. п.), а от компьютера >держаться подальше. Если проект большой, то будет больше людей, больше умных слов вроде «Use case», «Workflow», «UML», но принцип тот же. >Ведь цель собеседования в том, чтобы на примере простых задач показать и умение писать на таком-то ЯП, и умение решать задачи вообще, и, >просто, свой подход к этому делу.

+1. поддерживаю в этом вопросе Джоела. я кстати все собеседования провожу у доски, у меня кандидаты обычно что-то рисуют —
диаграммы классов, или структурные схемы. даю небольшую задачку на дизайн классов, или прошу нарисовать схему системы которую он спроектировал на предыдущей работе. если человек может объяснить что и зачем он делал, и понимает как работает вообще все, а не только те куски кода что он непосредственно писал — значит хороший кандидат!
Re[3]: придумал (операторы)
От: Awaken Украина  
Дата: 20.08.07 09:18
Оценка:
RO>Вызов операторов-членов не применяет пользовательские преобразования типов к левому операнду, поэтому все симметричные операторы должны >быть друзьями.

в случае унарных операторов не так все очевидно, так что можно порассуждать о преимуществах и недостатках разных способов перегрузки.
Re[8]: придумайте умный вопрос по с++
От: Sergey Россия  
Дата: 20.08.07 11:56
Оценка:
> у Саттера кажется, было рассуждение по поводу нужно ли проверять ошибки распределения памяти в new. сводится оно примерно к следующему:
> в системах с виртуальной памятью память "есть" всегда , если же ее нет то значит система в состоянии аварийного завершения.
> единственное что тут можно сделать это записать ошибку в лог (что может тоже не сработать т.к. места на диске уже нет)
>

Чересчур сильный вывод. При запуске 32-битных приложений на 64-битной винде вполне возможна ситуация, когда память (адресное пространство) для конкретного приложения кончилась, но система в целом продолжает работать. В принципе, нетрудно также представить себе 32-битную (или любой другой разрядности) операционку, которая умеет работать со свопфайлом, превышающим по размеру 2^32 байт.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[7]: придумайте умный вопрос по с++
От: Alex Alexandrov США  
Дата: 20.08.07 18:25
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Alex Alexandrov, Вы писали:


AA>>Вообще-то, в дебаге область локальных переменных заполняется 0xCC, а не нулями.


RO>Вообще-то, кроме MSVS есть и более другие IDE.


Вообще-то, IDE тут совершенно не при чем. Лишь компилятор имеет значение в рассматриваемом вопросе.

RO>Да и для MSVS всё не так просто: http://rsdn.ru/forum/message/1237078.1.aspx
Автор: Кодёнок
Дата: 23.06.05


За ссылку спасибо — как раз ее искал, найти не мог. В высказывании выше я, правда, довольно однозначно указываю на "область локальных переменных". Соответственно, там всегда 0xcc.
It's kind of fun to do the impossible (Walt Disney)
Re[6]: придумайте умный вопрос по с++
От: landerhigh Пират  
Дата: 21.08.07 00:16
Оценка: +1
Здравствуйте, alpha21264, Вы писали:

A>бросают исключения, ловят, сообщают пользователю, и сохраняют текущее состояние

A>данных до начала операции (транзакции).
A>Критерий профессионализма.
Профессионалов-сообщателей пользователям (особенно в виде модальных диалог боксов вроде "не могу открыть лог файл" и прочих очень нужных, полезных, а главное, понятных пользователю сообщений) нужно публично пороть на главной площади. До прозрения.
www.blinnov.com
Re[11]: придумайте умный вопрос по с++
От: superman  
Дата: 21.08.07 08:16
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, OdesitVadim, Вы писали:


NB>>>дык вопрос был не в том, компилируется, или нет, а в том что выводит.

NB>>>при двухфазном поиске вызовется глобальня функция и прога ничего не напечатает.

OV>>ну а последненький gcc поддерживает двухвазный поиск?


NB>поддерживает.

NB>gcc 3.4.2 ничего не печатает.

gcc version 4.1.2 — аналогично.
Re[3]: придумайте умный вопрос по с++
От: jazzer Россия Skype: enerjazzer
Дата: 21.08.07 10:14
Оценка:
Здравствуйте, Erop, Вы писали:

E>у моих подчинённых и использование своих шаблонов запрещенно...


А у нас ничего не запрещено
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: придумайте умный вопрос по с++
От: Lorenzo_LAMAS  
Дата: 21.08.07 11:40
Оценка: 1 (1)
http://groups.google.ru/group/comp.lang.c++.moderated/browse_thread/thread/311a042a5b485b41/2d84c5b258ead4bc?hl=ru#2d84c5b258ead4bc
Of course, the code must be complete enough to compile and link.
Re[4]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 21.08.07 13:45
Оценка: +1 :)
Здравствуйте, jazzer, Вы писали:

E>>у моих подчинённых и использование своих шаблонов запрещенно...

J>А у нас ничего не запрещено

Да это как кому удобно. Лишь бы программы хорошие были, продавались и приносили людям пользу
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: придумайте умный вопрос по с++
От: alpha21264 СССР  
Дата: 21.08.07 20:43
Оценка: 7 (1) -2 :))) :)
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, alpha21264, Вы писали:




A>>Просто, если ты студент, то специально для тебя проведу ликбез.

RO>Я крайне рад тому, что в этом отношении составляю компанию Андрею Александреску, поскольку имею возможность выслушать превосходную лекцию. Жду с нетерпением.


Молодец! Хвалю.
То, что ты читаешь Александреску, безусловно тебе плюс.
Такое простое решение я не знал. Ты спихнул всю работу на компилятор.

Но то что ты привел содержит две ошибки.
1) Ты не проверяешь на присвоение обьекта самому себе (в этом случае
происходит ненужный захват и освобождение памяти).
2) В задании члены класса являются базовыми типами (то есть у них нет
конструкторов деструкторов и операции swap). Это сделано намерено —
чтобы твой вариант не работал

Мне вспоминается мой учитель по матану. Он как-то нам дал задание
взять производные простых функций не пользуясь известными нам
формулами. То есть пользуясь только пределами. И привел такую аналогию.
Вы можете проехать стометровку на мотоцикле. Это будет быстрее, чем
пробежать ее. Но будет потерян смысл бега на сто метров — тренировка.

Правда это все мелочи. Смысл в другом.

Оператор присваивания — это просто функция. Тебе ведь придется писать не
только операторы присваивания Когда ты делаешь операцию над обьектом,
операция может завершиться неудачей. Это может быть не только из-за отсутсвия
памяти. Это может быть отсутсвие файла, неправильные данные от пользователя,
синтаксическая ошибка или просто твой коллега плохо написал свой кусок кода
и у него индекс вышел за границы массива. Короче — "не получилось". В этом
функция должна бросить исключение (или вернуть код ошибки) и оставить обьект
в состоянии, которое было до операции. Ну и разумеется, при этом не должно
быть утечек памяти. Так нужно писать ЛЮБУЮ функцию. Оператор присваивания
это только частный случай.

Зачем это нужно? Ну например секретарша целый день писала "очень важный" отчет.
В последний момент она решила вставить "очень нужную" диаграмму. Вывалиться по
недостатку памяти — значит угробить ее дневную работу.

Основную идею ты наверное уже понял.
1) Нужно создать новый обьект. Все изменения делать с ним.
2) Если операция прошла успешно, то новый обьект заменяет старый.
3) Если операция прошла неуспешно, то новый обьект уничтожается
(старый остается неизменным).

Я не могу сейчас найти статью, где все это рассматривается очень подробно.
Приводится около десяти различных реализаций оператора присваивания,
(каждая все длиннее и сложнее предыдущей ) при этом рассказывается
какие ошибки допущены в каждой реализации. Воспроизвести по памяти могу,
но это будет уже не так качественно как в оригинале.

Как найду эту статью, помещу ссылку в конференцию.

ЗЫ1. (То что к делу не относится)

RO>Трудное это дело, когда термины придумываются на английском языке, а потом переводятся безграмотными переводчиками.


Даже торговец шерстью должен думать не только о том, чтобы подешевле купить
и подороже продать, но и о том, чтобы беспрепятсвенно могла осуществляться торговля.
Говорить все равно надо по-русски, если мы хотим сохранить СВОЮ страну и свою "техническую
культуру". Это только кажется, что без разницы на каком языке сказать. На самом деле
каждое занесенное в язык иностранное слово увеличивает барьер вхождения для будующих
студентов. А отсутсвие литературы на родном языке поднимает этот барьер до непреодолимого.

RO>>>>>
RO>>>HelloSutter& HelloSutter::operator =(HelloSutter other)
RO>>>{
RO>>>    swap(other);
RO>>>    return *this;
RO>>>}
RO>>>


Не будь "слишком умным". То, что ты написал правильно с точки зрения компьютера,
но непривычно для человека. Я увидел, что перед other отсутсвует & только после
того, как ты сказал Я ошибся, но ведь здесь было легко ошибиться.
В мое время не рекомендовали писать вот так x=a[--i++] а рекомендовал так x=a[i-1]

ЗЫ2.

ТВОЕ РЕШЕНИЕ ПРАВИЛЬНОЕ.
Другое дело, что оно не позволяет оценить, умеешь ли ты писать

Течёт вода Кубань-реки куда велят большевики.
Re[8]: придумайте умный вопрос по с++
От: jazzer Россия Skype: enerjazzer
Дата: 22.08.07 14:28
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Такое простое решение я не знал. Ты спихнул всю работу на компилятор.


Вот это сильно. Тут народ бьется, ночей не спит, чтоб как можно больше возложить на компилятор, а по-твоему, оказывается, это проблема (наверное, надо вообще гуманнее относиться к компилятору, не напрягать его всякими сиплюсплюсами и писать на ассемблере )

A>Но то что ты привел содержит две ошибки.

A>1) Ты не проверяешь на присвоение обьекта самому себе (в этом случае
A> происходит ненужный захват и освобождение памяти).

Это не ошибка. Это просто отсутствие оптимизации.
Вроде у тебя не было условия "реализовать максимально эффективно по такому-то критерию"

A>2) В задании члены класса являются базовыми типами (то есть у них нет

A> конструкторов деструкторов и операции swap). Это сделано намерено —
A> чтобы твой вариант не работал

std::swap — шаблонная попробуй на досуге позвать ее как-нть так:
int x=1, y=2;
std::swap(x, y);

Вот тебе на всякий случай цитата из Стандарта:

25.2.2 Swap [lib.alg.swap]
template<class T> void swap(T& a, T& b);
1 Requires: Type T is CopyConstructible (20.1.3) and Assignable (23.1).
2 Effects: Exchanges values stored in two locations.



A>взять производные простых функций не пользуясь известными нам

A>формулами. То есть пользуясь только пределами.

Тогда так и надо ставить условие задачи: "Решить, не пользуясь А, Б, Ц"

A>Так нужно писать ЛЮБУЮ функцию.


То, что ты описал — это строгая гарантия безопасности исключений.
Совсем необязательно добиваться именно ее.
Иногда она просто не нужна по характеру задачи, иногда ее реализация приводит к неприемлемым накладным расходам, иногда ее невозможно добиться в принципе.
Для таких случаев достаточно добиться базровой гарантии (т.е. отсутствия утечек и некорректного состояния).

A>Зачем это нужно? Ну например секретарша целый день писала "очень важный" отчет.

A>В последний момент она решила вставить "очень нужную" диаграмму. Вывалиться по
A>недостатку памяти — значит угробить ее дневную работу.

A>Основную идею ты наверное уже понял.

A>1) Нужно создать новый обьект. Все изменения делать с ним.
A>2) Если операция прошла успешно, то новый обьект заменяет старый.
A>3) Если операция прошла неуспешно, то новый обьект уничтожается
A> (старый остается неизменным).

У тебя объект — трехгигабайтная матрица. Твои действия?

A>Не будь "слишком умным".


Характерный аргумент. Работал я как-то с таким менеджером. Говорит: "Делай А". Я в ответ: "Нельзя А, надо Б, потому что (лекция на полчаса)". Он: "Не умничай".

A>То, что ты написал правильно с точки зрения компьютера,

A>но непривычно для человека.

Значит, надо набирать таких человеков, для которых это привычно.
Если, конечно, не стоит задачи экономить на программистах.

A>Я увидел, что перед other отсутсвует & только после

A>того, как ты сказал Я ошибся, но ведь здесь было легко ошибиться.

Ну вот эта придирка по делу. В таких случаях хороший программист поставит соответствующий комментарий.

A>ТВОЕ РЕШЕНИЕ ПРАВИЛЬНОЕ.

A>Другое дело, что оно не позволяет оценить, умеешь ли ты писать
Вполне позволяет.
Sapienti sat.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[8]: придумайте умный вопрос по с++
От: Roman Odaisky Украина  
Дата: 22.08.07 20:55
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>>>Просто, если ты студент, то специально для тебя проведу ликбез.

RO>>Я крайне рад тому, что в этом отношении составляю компанию Андрею Александреску, поскольку имею возможность выслушать превосходную лекцию. Жду с нетерпением.

A>Молодец! Хвалю.

A>То, что ты читаешь Александреску, безусловно тебе плюс.
А где я признавался, что читал Александреску? ;-)

A>Такое простое решение я не знал. Ты спихнул всю работу на компилятор.


A>Но то что ты привел содержит две ошибки.

A>1) Ты не проверяешь на присвоение обьекта самому себе
Саттер заявляет, что operator =, который неправильно работает в случае самоприсваивания, наверняка не exception safe.

A>(в этом случае происходит ненужный захват и освобождение памяти)

А это уже правило Кнута, которое придумал Хоар в 70-х гг.: premature optimization is the root of all evil.

A>2) В задании члены класса являются базовыми типами (то есть у них нет

A> конструкторов деструкторов и операции swap). Это сделано намерено —
A> чтобы твой вариант не работал :)

У всех типов C++ есть и то, и другое, и третье, если только программер явно их не убрал.

A>Мне вспоминается мой учитель по матану. Он как-то нам дал задание

A>взять производные простых функций не пользуясь известными нам
A>формулами. То есть пользуясь только пределами. И привел такую аналогию.
A>Вы можете проехать стометровку на мотоцикле. Это будет быстрее, чем
A>пробежать ее. Но будет потерян смысл бега на сто метров — тренировка.

Это те веселые примеры вроде y = x^2 cos(1/x)?

A>Правда это все мелочи. Смысл в другом.


A>Оператор присваивания — это просто функция. Тебе ведь придется писать не

A>только операторы присваивания :) Когда ты делаешь операцию над обьектом,
A>операция может завершиться неудачей. Это может быть не только из-за отсутсвия
A>памяти. Это может быть отсутсвие файла, неправильные данные от пользователя,
A>синтаксическая ошибка или просто твой коллега плохо написал свой кусок кода
A>и у него индекс вышел за границы массива. Короче — "не получилось". В этом
A>функция должна бросить исключение (или вернуть код ошибки) и оставить обьект
A>в состоянии, которое было до операции. Ну и разумеется, при этом не должно
A>быть утечек памяти. Так нужно писать ЛЮБУЮ функцию. Оператор присваивания
A>это только частный случай.

A>Зачем это нужно? Ну например секретарша целый день писала "очень важный" отчет.

A>В последний момент она решила вставить "очень нужную" диаграмму. Вывалиться по
A>недостатку памяти — значит угробить ее дневную работу.

А я с этим спорил? Я же уже привел раньше по курсу фрагмент (псевдо)кода именно с этой семантикой:
void onDiagramButtonClick()
{
    try
    {
        askUserWhatDiagramSheDesiresAndPlaceIt();
    }
    catch(std::exception const& e)
    {
        logEvent(e.what());
        alertUser("Failed to create a diagram");
    }
}


A>Основную идею ты наверное уже понял.

A>1) Нужно создать новый обьект. Все изменения делать с ним.
A>2) Если операция прошла успешно, то новый обьект заменяет старый.
A>3) Если операция прошла неуспешно, то новый обьект уничтожается
A> (старый остается неизменным).

Ну так вот же моя реализация:
RO>>>>>>
RO>>>>HelloSutter& HelloSutter::operator =(HelloSutter other) // новый объект
RO>>>>{
RO>>>>    swap(other); // заменить
RO>>>>    return *this;
RO>>>>}
RO>>>>


A>Я не могу сейчас найти статью, где все это рассматривается очень подробно.

A>Приводится около десяти различных реализаций оператора присваивания,
A>(каждая все длиннее и сложнее предыдущей :) ) при этом рассказывается
A>какие ошибки допущены в каждой реализации. Воспроизвести по памяти могу,
A>но это будет уже не так качественно как в оригинале.

A>Как найду эту статью, помещу ссылку в конференцию.


A>ЗЫ1. (То что к делу не относится)


RO>>Трудное это дело, когда термины придумываются на английском языке, а потом переводятся безграмотными переводчиками.


A>Даже торговец шерстью должен думать не только о том, чтобы подешевле купить

A>и подороже продать, но и о том, чтобы беспрепятсвенно могла осуществляться торговля.
A>Говорить все равно надо по-русски, если мы хотим сохранить СВОЮ страну и свою "техническую
A>культуру". Это только кажется, что без разницы на каком языке сказать. На самом деле
A>каждое занесенное в язык иностранное слово увеличивает барьер вхождения для будующих
A>студентов. А отсутсвие литературы на родном языке поднимает этот барьер до непреодолимого.

Ну да, непреодолимого. Я читал по-английски и The Lord of the Rings, и Exceptional C++.

И тем более, свою страну я сохраню, зачем мне ваша? ;-)

RO>>>>>>
RO>>>>HelloSutter& HelloSutter::operator =(HelloSutter other)
RO>>>>{
RO>>>>    swap(other);
RO>>>>    return *this;
RO>>>>}
RO>>>>


A>Не будь "слишком умным". То, что ты написал правильно с точки зрения компьютера,

A>но непривычно для человека. Я увидел, что перед other отсутсвует & только после
A>того, как ты сказал :) Я ошибся, но ведь здесь было легко ошибиться.
A>В мое время не рекомендовали писать вот так x=a[--i++] а рекомендовал так x=a[i-1]

А первое — UB, так нужно не только не рекомендовать, а по рукам бить.

A>ЗЫ2.


A>ТВОЕ РЕШЕНИЕ ПРАВИЛЬНОЕ.

Спасибо :-)

A>Другое дело, что оно не позволяет оценить, умеешь ли ты писать :)

Так всегда же можно спросить, почему именно так.
До последнего не верил в пирамиду Лебедева.
Re[2]: Reverse строки
От: Пётр Седов Россия  
Дата: 23.08.07 12:32
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:
RO>развернуть строку задом наперед.
Была ветка
Автор:
Дата: 30.10.06
про reverse строки.
Пётр Седов (ушёл с RSDN)
Re: придумайте умный вопрос по с++
От: spider1970  
Дата: 23.08.07 21:35
Оценка:
Здравствуйте, Awaken, Вы писали:

A>надо для собеседования

A>большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"),
A>либо из серии знаешь/не знаешь.
A>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь"
A>парочка вопросов которые мне понравились:
A>-почему в С++ нельзя реализовать полноценный сборщик мусора?
A>-в каких ситуациях перегрузка левого ++ лучше чем правого
Voobshe kto znaet pok kakie tseli sozdavalsia C++.S tsego natsali i k tsemu prisli.
Sto nado programmirovat na C++ a sto nenado.Eto glavnoe.A programmirovanie na C++ eto bolshe vsego znaesh ne
znaesh, i naskolko vnimatelno tsitaesh dokumentatsiu i ponimaesh tsusoi kod(stsitai opit).Kstati ,samo programmirovanie ne otsen to i umnaia nauka no trebuet bolsoi usidtsivosti.A esli oprasivaemii umnee sprashivaiusego?
Re: окончательный вопрос
От: 0xDEADBEEF Ниоткуда  
Дата: 23.08.07 22:19
Оценка: 1 (1)
Здравствуйте, Awaken, Вы писали:

...просканировал тему, вроде бы не задавали.
Впрочем, подобный вопрос подходит для любого языка.

Точнее, вопросов два:
— скажите, что в языке вам НЕ НРАВИТСЯ
— обьясните, эту проблему (проблемы) вы обходите

Готовых ответов и их реакций на них предложить не могу.
Для любого языка, который я знаю — не только C++.
Но, он позволяет многое узнать о претенденте и его предпочтениях.
__________
16.There is no cause so right that one cannot find a fool following it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.