В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут . Как? Очень просто — нервы + забыл элементарную вещь.
Первый вопрос был написать класс и наследуемый от него. Сделал. Второй вопрос — про приведение типов. Ответил. Третий вопрос был фатальным. Угадайте, какой... написать для данного класса конструктор копирования. Ну забыл я, забыл!
Написал дрожащими руками вот такое:
A::A(A a)
{
...
}
Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
20.01.07 17:53: Перенесено модератором из 'C/C++' — Хитрик Денис
Здравствуйте, Hottabych1, Вы писали:
H>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования?
Может солидной фирме нужен был специалист по с++ и у нех небыло свободной джунировской позиции.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, Hottabych1, Вы писали:
H>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут . Как? Очень просто — нервы + забыл элементарную вещь. H>Первый вопрос был написать класс и наследуемый от него. Сделал. Второй вопрос — про приведение типов. Ответил. Третий вопрос был фатальным. Угадайте, какой... написать для данного класса конструктор копирования. Ну забыл я, забыл! H>Написал дрожащими руками вот такое:
H>
H>A::A(A a)
H>{
H>...
H>}
H>
H>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
А по-моему, есть вещи, которые нельзя забывать никогда, как таблицу умножения... А еще есть вещи, говорящие о непонимании практически базовых концепций и принципов. И соискатель, может быть, прав в данной ситуации — ему нужно получить наиболее хорошо знающего работника.
Здравствуйте, Hottabych1, Вы писали:
H>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут . Как? Очень просто — нервы + забыл элементарную вещь.
H>
H>A::A(A a)
H>{
H>...
H>}
H>
Ты главное сильно не расстраивайся, со всеми бывает
Здравствуйте, 0xd34df00d, Вы писали:
0>Здравствуйте, Hottabych1, Вы писали:
H>>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут . Как? Очень просто — нервы + забыл элементарную вещь. H>>Первый вопрос был написать класс и наследуемый от него. Сделал. Второй вопрос — про приведение типов. Ответил. Третий вопрос был фатальным. Угадайте, какой... написать для данного класса конструктор копирования. Ну забыл я, забыл! H>>Написал дрожащими руками вот такое:
H>>
H>>A::A(A a)
H>>{
H>>...
H>>}
H>>
H>>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
0>А по-моему, есть вещи, которые нельзя забывать никогда, как таблицу умножения... А еще есть вещи, говорящие о непонимании практически базовых концепций и принципов. И соискатель, может быть, прав в данной ситуации — ему нужно получить наиболее хорошо знающего работника.
Согласен! Просто привык Си++ считать просто инструментом в работе. Например, мне нужно то-то... как там, значит, оно в Си++ делается? И лезу в справочник. После чего на следующий день благополучно это забываю. Насколько оправдан такой подход?
Здравствуйте, Hottabych1, Вы писали:
H>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут . Как? Очень просто — нервы + забыл элементарную вещь. H>Первый вопрос был написать класс и наследуемый от него. Сделал. Второй вопрос — про приведение типов. Ответил. Третий вопрос был фатальным. Угадайте, какой... написать для данного класса конструктор копирования. Ну забыл я, забыл! H>Написал дрожащими руками вот такое:
H>
H>A::A(A a)
H>{
H>...
H>}
H>
H>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
Здравствуйте, Hottabych1, Вы писали:
H>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут .
Не расстраивайся.
H>Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
Узнаются может за ничтожное... но вот понимаются. К чему приводит отсутствие конструктора/оператора копирования я понял года через два, после того как узнал об их сущестовании. В течении этих двух лет я, как тот канадский программер, смело сражался с багами
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
H>>Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
КД>Узнаются может за ничтожное... но вот понимаются. К чему приводит отсутствие конструктора/оператора копирования я понял года через два, после того как узнал об их сущестовании. В течении этих двух лет я, как тот канадский программер, смело сражался с багами
Навеяло... а то, как пишется нормальный оператор копирования, я понял еще через пару лет
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, MP321, Вы писали:
MP>Здравствуйте, Hottabych1, Вы писали:
H>>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут . Как? Очень просто — нервы + забыл элементарную вещь. H>>Первый вопрос был написать класс и наследуемый от него. Сделал. Второй вопрос — про приведение типов. Ответил. Третий вопрос был фатальным. Угадайте, какой... написать для данного класса конструктор копирования. Ну забыл я, забыл! H>>Написал дрожащими руками вот такое:
H>>
H>>A::A(A a)
H>>{
H>>...
H>>}
H>>
H>>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
MP>Хм , а они объяснили, как по ихнему правильно?
Намекали... Потому я допер поставить там ссылку, потом намекали на const... а потом сказали, что люди, которые к ним приходят пишут это с ходу, потому "до свидания".
Здравствуйте, Hottabych1, Вы писали:
H>Здравствуйте, 0xd34df00d, Вы писали:
0>>Здравствуйте, Hottabych1, Вы писали:
{} H>>>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
0>>А по-моему, есть вещи, которые нельзя забывать никогда, как таблицу умножения... А еще есть вещи, говорящие о непонимании практически базовых концепций и принципов. И соискатель, может быть, прав в данной ситуации — ему нужно получить наиболее хорошо знающего работника.
H>Согласен! Просто привык Си++ считать просто инструментом в работе. Например, мне нужно то-то... как там, значит, оно в Си++ делается? И лезу в справочник. После чего на следующий день благополучно это забываю. Насколько оправдан такой подход?
Имхо если постоянно открывать справочники (пусть даже это будет какое-нибудь контекстно-зависимое окошко в VS) по любому поводу, то очень много времени теряется.
Тут важна граница, ведь учить наизусть библиотеку, скажем, алгоритмов из STL — тоже не очень хорошо )
Здравствуйте, Hottabych1, Вы писали:
H>Согласен! Просто привык Си++ считать просто инструментом в работе. Например, мне нужно то-то... как там, значит, оно в Си++ делается? И лезу в справочник. После чего на следующий день благополучно это забываю. Насколько оправдан такой подход?
Извини, но это базовое знание, за которым не лезут в справочник.
Здравствуйте, 0xd34df00d, Вы писали:
0>А по-моему, есть вещи, которые нельзя забывать никогда, как таблицу умножения... А еще есть вещи, говорящие о непонимании практически базовых концепций и принципов. И соискатель, может быть, прав в данной ситуации — ему нужно получить наиболее хорошо знающего работника.
Любой мог ошибиться. Даже с таблицей умножения.
У нас в институте как то поставили новый курс с новым профессором. Типа большой спец в своей теме, огромный опыт работы да еще и в Европе (Франция, Польша) и все такое. На одном из занятий что-то там преобразовывали и надо было подсчитать длину спектра. Проф "Ну значит 7, а тут 8. Значит 7 на 8. Сколько там получается? О 48."
Дураки они! Они должны были просто и спокойно спросить — "А что при этом произойдет?" — или даже дать комп и попросить проверить. Если уж и в этом случае долго не доходит, только тогда можно делать выводы о безнадежности пациента.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, DerBober, Вы писали:
DB>Здравствуйте, 0xd34df00d, Вы писали:
0>>А по-моему, есть вещи, которые нельзя забывать никогда, как таблицу умножения... А еще есть вещи, говорящие о непонимании практически базовых концепций и принципов. И соискатель, может быть, прав в данной ситуации — ему нужно получить наиболее хорошо знающего работника.
DB>Любой мог ошибиться. Даже с таблицей умножения.
DB>У нас в институте как то поставили новый курс с новым профессором. Типа большой спец в своей теме, огромный опыт работы да еще и в Европе (Франция, Польша) и все такое. На одном из занятий что-то там преобразовывали и надо было подсчитать длину спектра. Проф "Ну значит 7, а тут 8. Значит 7 на 8. Сколько там получается? О 48."
Он уже был профессором. Кому-то что-то прощается. Все зависит от ситуации. Есть моменты, когда ошибаться никак нельзя. Можно тысячу раз неправильно дернуть ручку на эмуляторе самолета, но на реальном — лучше не стоит
Здравствуйте, McSeem2, Вы писали:
MS>Здравствуйте, Hottabych1, Вы писали:
H>>
H>>A::A(A a)
H>>{
H>>...
H>>}
H>>
MS>Дураки они! Они должны были просто и спокойно спросить — "А что при этом произойдет?" — или даже дать комп и попросить проверить. Если уж и в этом случае долго не доходит, только тогда можно делать выводы о безнадежности пациента.
В принципе, они почти так и сделали. После чего я догадался передавать параметр как ссылку, а вот с const ступил.
Здравствуйте, Hottabych1, Вы писали:
H>Здравствуйте, McSeem2, Вы писали:
MS>>Здравствуйте, Hottabych1, Вы писали:
H>>>
H>>>A::A(A a)
H>>>{
H>>>...
H>>>}
H>>>
MS>>Дураки они! Они должны были просто и спокойно спросить — "А что при этом произойдет?" — или даже дать комп и попросить проверить. Если уж и в этом случае долго не доходит, только тогда можно делать выводы о безнадежности пациента. H>В принципе, они почти так и сделали. После чего я догадался передавать параметр как ссылку, а вот с const ступил.
Ну и забей. Как уже было верно отмечено, это не самое важное в жизни Да и вообще, это бесценный опыт и тренировка!
Здравствуйте, 0xd34df00d, Вы писали:
0>А по-моему, есть вещи, которые нельзя забывать никогда, как таблицу умножения...
Такие вещи, как передача по значению в конструкторе копирования надо не запоминать, а логически выводить — почему так делать нельзя. Стоит если хотя бы раз понять — "почему" и уже никогда так не напишешь. И так во всем. А зазубривание немногого стоит.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, McSeem2, Вы писали:
MS>Здравствуйте, 0xd34df00d, Вы писали:
0>>А по-моему, есть вещи, которые нельзя забывать никогда, как таблицу умножения...
MS>Такие вещи, как передача по значению в конструкторе копирования надо не запоминать, а логически выводить — почему так делать нельзя. Стоит если хотя бы раз понять — "почему" и уже никогда так не напишешь. И так во всем. А зазубривание немногого стоит.
А еще у меня была вторая часть высказывания, которая как раз к этому и относилась
Здравствуйте, Hottabych1, Вы писали:
H>Намекали... Потому я допер поставить там ссылку, потом намекали на const...
Про const ты их самих в ответ мог послать.
const необязателен.
Конструктор копирования — это конструктор с одним параметром-ссылкой на тот же самый класс.
Константная это ссылка или нет — не важно.
Ближайший пример конструктора копирования по неконстантной ссылке — std::auto_ptr.
Здравствуйте, jazzer, Вы писали:
J>Про const ты их самих в ответ мог послать. J>const необязателен. J>Конструктор копирования — это конструктор с одним параметром-ссылкой на тот же самый класс.
Пункт стандарта?
Здравствуйте, Hottabych1, Вы писали:
H>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако H>
H>A::A(A a)
H>{
H>...
H>}
H>
напрасно они прекратили собеседование, надо было дальше вопросы задавать
видать, совсем им сотрудники не нужны. А сколько человек работает в фирме? Конкретно в том представительстве, где шло собеседование?
Здравствуйте, THESERG, Вы писали:
THE>напрасно они прекратили собеседование, надо было дальше вопросы задавать
Зависит от требований, предъявляемых к кандидату.
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, THESERG, Вы писали:
THE>>напрасно они прекратили собеседование, надо было дальше вопросы задавать LM>Зависит от требований, предъявляемых к кандидату.
а также от разницы между тем что написано в резюме и что на самом деле
т.е. если написано об опыте программирования на с++ несколько лет, то такая ошибка уже непростительна
чем дальше тем больше спрос
Здравствуйте, LuciferMoscow, Вы писали:
LM>Пункт стандарта?
12.8.2 A nontemplate constructor for class X is a copy constructor if its first parameter is of type X&, const X&,
volatile X& or const volatile X&, and either there are no other parameters or else all other
parameters have default arguments (8.3.6).106) [Example: X::X(const X&) and X::X(X&, int=1)
are copy constructors.
class X {
// ...
public:
X(int);
X(const X&, int = 1);
};
X a(1); // calls X(int);
X b(a, 0); // calls X(const X&, int);
X c = b; // calls X(const X&, int);
—end example] [Note: all forms of copy constructor may be declared for a class. [Example:
class X {
// ...
public:
X(const X&);
X(X&); //OK
};
—end example] —end note] [Note: if a class X only has a copy constructor with a parameter of type X&,
an initializer of type const X or volatile X cannot initialize an object of type (possibily cvqualified)
X. [Example:
struct X {
X(); //default constructor
X(X&); //copy constructor with a nonconst parameter
};
const X cx;
X x = cx; // error – X::X(X&) cannot copy cx into x
—end example] —end note]
Здравствуйте, Hottabych1, Вы писали:
H>В пятницу был в одной очень солидной фирме. H>... H>Каково ваше мнение?
Это еще что, я тут отослал резюме в прошлую пятницу, и на среду у меня было назначено собеседование. Так вот прихожу к ниим и понеслась:
поначалу они мне рассказали о себе потом начали интересоваться моим опытом
вопрос — что такое валидный xml и что такое вел-формд xml?
отвечаю — что типа первое по схеме второе по спецификации
— а по подробнее про второе
— типа то-то и то-то (примерно 0-1% от спецификации)
— начинают приводить откровенно неправильные примеры, говоря что по вашим словам так можно
— после пары примеров (может слишком грубо) говорю что они должны были бы понять что я знаю про xml, а цитировать всю спецификацию у меня нет желания
после этого вопросы по xml кончились
вопрос — какие патерны вы знаете
ответ — тот-то и тот-то..
— а про синглетон слушали
— слышал но ничего рассказать не могу
— а привести примеры реализации
— если я не могу рассказать про патерн то как по вашему я могу рассказать про его реализацию
— а подумать не хотите
— нет не хочу
вопрос — что такое полиморфизм знаете
ответ — что-то припоминаю, но толком рассказать не могу
далее по принципу предыдущего вопроса
на самом деле было много вопросов на которые я ответел и много на которые нет, просто в пятницу я был готов морально к собеседованию, а с воскресенья по среду я спал по 2 часа в день(по ноль часов в ночь ) работы просто немеряно подготовиться хотел не вышло , на собеседовании чуть не уснул и моментами погружался в свои мысли
Вобщем печально вышло, не так как я хотел
Здравствуйте, Hottabych1, Вы писали:
H>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут . Как? Очень просто — нервы + забыл элементарную вещь. H>Первый вопрос был написать класс и наследуемый от него. Сделал. Второй вопрос — про приведение типов. Ответил. Третий вопрос был фатальным. Угадайте, какой... написать для данного класса конструктор копирования. Ну забыл я, забыл! H>Написал дрожащими руками вот такое:
H>
H>A::A(A a)
H>{
H>...
H>}
H>
H>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
Честно говоря, это вещь элементарная. Как пишется конструктор копий неплохо бы знать в любое время суток, в любом состоянии.
А я вот как-то завалил тест на удалённую работу.Надо было написать 2 простых приложения не на С++, правда, а на Delphi.Оценивались, судя по всему, подход к решению задачи, стиль, качество кода и.т.д. С заданием вроде справился,но вот качество кода — не устроило...
Здравствуйте, Hottabych1, Вы писали:
H>В принципе, они почти так и сделали. После чего я догадался передавать параметр как ссылку, а вот с const ступил.
Здравствуйте, Димчанский, Вы писали:
Д>Здравствуйте, Hottabych1, Вы писали:
H>>В принципе, они почти так и сделали. После чего я догадался передавать параметр как ссылку, а вот с const ступил.
Д>Они тоже ступили. const не обязателен.
Вероятно, они имели в виду, что применение const — это признак хорошего качественного кода, в который изначально заложен дополнительный контроль и предотвращение возможных багов. Потому что const, по большому счету, в принципе необязателен... но зачем-то его придумали
Здравствуйте, THESERG, Вы писали:
THE>Здравствуйте, Hottabych1, Вы писали:
H>>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако H>>
H>>A::A(A a)
H>>{
H>>...
H>>}
H>>
THE>напрасно они прекратили собеседование, надо было дальше вопросы задавать
THE>видать, совсем им сотрудники не нужны. А сколько человек работает в фирме? Конкретно в том представительстве, где шло собеседование?
Народу там работает очень много, а фирма известна настолько, что ее услугами (хоть это и IT-фирма) пользуется буквально каждая домохозяйка, имеющая подключение к Интернету... Не знаю, насколько корректно будет привести здесь название фирмы.
Здравствуйте, skymaster, Вы писали:
S>Здравствуйте, Hottabych1, Вы писали:
H>>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут . Как? Очень просто — нервы + забыл элементарную вещь. H>>Первый вопрос был написать класс и наследуемый от него. Сделал. Второй вопрос — про приведение типов. Ответил. Третий вопрос был фатальным. Угадайте, какой... написать для данного класса конструктор копирования. Ну забыл я, забыл! H>>Написал дрожащими руками вот такое:
H>>
H>>A::A(A a)
H>>{
H>>...
H>>}
H>>
H>>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
S>Честно говоря, это вещь элементарная. Как пишется конструктор копий неплохо бы знать в любое время суток, в любом состоянии. S>А я вот как-то завалил тест на удалённую работу.Надо было написать 2 простых приложения не на С++, правда, а на Delphi.Оценивались, судя по всему, подход к решению задачи, стиль, качество кода и.т.д. С заданием вроде справился,но вот качество кода — не устроило...
Здравствуйте, Viper84, Вы писали:
V>вопрос — что такое полиморфизм знаете V>ответ — что-то припоминаю, но толком рассказать не могу
Если не секрет, что было написано в резюме по поводу объектно-ориентированного дизайна и анализа? Потому что меня такой ответ тоже удивил бы
V>на самом деле было много вопросов на которые я ответел и много на которые нет, просто в пятницу я был готов морально к собеседованию, а с воскресенья по среду я спал по 2 часа в день(по ноль часов в ночь ) работы просто немеряно подготовиться хотел не вышло , на собеседовании чуть не уснул и моментами погружался в свои мысли
Вот это и есть классика жанра Главное правило студента: "Перед смертью не надышишься" Поэтому вечер перед экзаменом должен проводиться в атмосфере комфорта и расслабления, а ночь — в состоянии крепкого сна И никакого "подготовиться" накануне
Здравствуйте, Hottabych1, Вы писали:
H>Народу там работает очень много, а фирма известна настолько, что ее услугами (хоть это и IT-фирма) пользуется буквально каждая домохозяйка, имеющая подключение к Интернету... Не знаю, насколько корректно будет привести здесь название фирмы.
Приводи. Лично я не увидел ничего компрометирующего фирму
P.S. Просто стало интересно чем пользуются домохозяйки
Здравствуйте, Александр Каширин, Вы писали:
АК>Если не секрет, что было написано в резюме по поводу объектно-ориентированного дизайна и анализа? Потому что меня такой ответ тоже удивил бы
не секрет . Ща пересмотрел чистой записи про ооп нет, но подразумевается, согласен меня бы тож удивил, точнее даж мой ответ меня удивил и не токо этот .
АК>Вот это и есть классика жанра Главное правило студента: "Перед смертью не надышишься" Поэтому вечер перед экзаменом должен проводиться в атмосфере комфорта и расслабления, а ночь — в состоянии крепкого сна И никакого "подготовиться" накануне
на самом деле я считаю, что с подготовленным человеком не интересно общаться, на все вопросы я отвечал как есть, на предложения подумать отказывался так как прекрасно понимал что даж если и буду думать, то только о своей нынещней работе т.к. работы там выше крыши.
с другой стороны я не подал никаких илюзий, я мог гораздо лучше , но зачем
да я абсолютно согласен что я обнаглел, приходя на собеседования не отвечать на вопросы по фундаментальным знаниям и при этом просить не маленькие деньги(но в данный момент я справляюсь со всеми поставленными задачами без всяких четких знаний, мне хватает моих образных знаний, если надо изучу)
Здравствуйте, THESERG, Вы писали:
THE>Здравствуйте, LuciferMoscow, Вы писали:
LM>>P.S. Просто стало интересно чем пользуются домохозяйки
THE>Делаем ставки!
THE>Ну, пусть это будет AVP (Касперский)
Здравствуйте, 0xd34df00d, Вы писали:
THE>>Ну, пусть это будет AVP (Касперский)
Возможно(все мои предположения сводились) к винде+офису.
Но он там не прошел бы брейнбенч.
0>Agnitum?
Домохозяйки?
0>Eset?
Не знаю. Может потому, что я не домохозяйка.
Здравствуйте, Александр Каширин, Вы писали:
АК>Вероятно, они имели в виду, что применение const — это признак хорошего качественного кода, в который изначально заложен дополнительный контроль и предотвращение возможных багов. Потому что const, по большому счету, в принципе необязателен... но зачем-то его придумали
Против const ничего не имею, я наоборот только за.
Возможно, это они и имели ввиду.
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, 0xd34df00d, Вы писали:
THE>>>Ну, пусть это будет AVP (Касперский) LM>Возможно(все мои предположения сводились) к винде+офису. LM>Но он там не прошел бы брейнбенч.
0>>Agnitum? LM>Домохозяйки?
0>>Eset? LM>Не знаю. Может потому, что я не домохозяйка.
Ставки сделаны, ставок больше нет, господа. Это был Яндекс...
Здравствуйте, skymaster, Вы писали:
S>Здравствуйте, Hottabych1, Вы писали:
H>>Теперь, думаю, я это запомню на всю жизнь
S>Ещё советую проштудировать перегрузку оператора присваивания. S>Тоже может пригодится на собеседовании.
Так... пишу по памяти
держи ещё вопросов:
— какова трудоёмкость поиска (значения по ключу) в stl контейнере map
— ну там, совсем банальные вопросы: чем отличаются раннее связывание от позднего, TCP от UDP, select от poll
Здравствуйте, 0xd34df00d, Вы писали:
0>>>А по-моему, есть вещи, которые нельзя забывать никогда, как таблицу умножения... А еще есть вещи, говорящие о непонимании практически базовых концепций и принципов. И соискатель, может быть, прав в данной ситуации — ему нужно получить наиболее хорошо знающего работника.
У меня как-то был период, когда мне, в силу специфики проекта, приходилось писать код на 5 разных языках. Так я иногда синтаксис цикла for забывал для какого-нибудь языка, не говоря уже про более сложные вещи. Цикл for — это, вроде как, базовая концепция. Говорит ли это о том, что я ее не понимаю и мне пора на свалку?
H>>Согласен! Просто привык Си++ считать просто инструментом в работе. Например, мне нужно то-то... как там, значит, оно в Си++ делается? И лезу в справочник. После чего на следующий день благополучно это забываю. Насколько оправдан такой подход?
0>Имхо если постоянно открывать справочники (пусть даже это будет какое-нибудь контекстно-зависимое окошко в VS) по любому поводу, то очень много времени теряется.
Это если ты секретарь-машинистка, то у тебя много времени теряется и ты становишься профнепригоден. Программист же, если его задачу нельзя отнести к категории самых элементарных, до 95% времени может потратить на размышления, чтения справочников и интернета, проверки вариантов, таймирование, тестирование, отладку, общение с коллегами и начальством итп.
0>Тут важна граница, ведь учить наизусть библиотеку, скажем, алгоритмов из STL — тоже не очень хорошо )
Да, и граница эта проходит на уровне понимания концепций, а отнюдь не на уровне синтаксиса, идиотских задач, вроде i += i++ + ++i, и прочего в этом роде.
Здравствуйте, Hottabych1, Вы писали:
S>>Ещё советую проштудировать перегрузку оператора присваивания. S>>Тоже может пригодится на собеседовании. H>Так... пишу по памяти H>
H>A& A::operator=(const A &a)
H>{
H>......// А тут что?
H>}
H>
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, Hottabych1, Вы писали:
S>>>Ещё советую проштудировать перегрузку оператора присваивания. S>>>Тоже может пригодится на собеседовании. H>>Так... пишу по памяти H>>
H>>A& A::operator=(const A &a)
H>>{
H>>......// А тут что?
H>>}
H>>
H>>Полагаю, так...
AFAIR:
1. Возвращаемое значение может быть любым
2. Но лучше, чтобы оно было ссылкой на объект типа A (в данном случае)
3. В самом конце тогда уж (если выполнять п. 2)
Здравствуйте, Hottabych1, Вы писали:
THE>>>>Ну, пусть это будет AVP (Касперский) LM>>Возможно(все мои предположения сводились) к винде+офису. LM>>Но он там не прошел бы брейнбенч.
0>>>Agnitum? LM>>Домохозяйки?
0>>>Eset? LM>>Не знаю. Может потому, что я не домохозяйка. H>Ставки сделаны, ставок больше нет, господа. Это был Яндекс...
Здравствуйте, avbochagov, Вы писали:
КД>>Навеяло... а то, как пишется нормальный оператор копирования, я понял еще через пару лет
A>даже интересно стало! а можно пример, как было до понимания, и как стало после понимания?
T& T::operator = (const T& x)
{
T tmp(x); // Copy constructorthis->swap(tmp); // NO EXCEPTIONS !!!return *this;
}//T::copy operator
Правда в последнее время, мне в голову все чаще и чаще приходя мысли, что проектировать классы нужно так, чтобы у них вообще не было реализаций конструкторов и операторов копирования.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, 0xd34df00d, Вы писали:
0>Здравствуйте, LuciferMoscow, Вы писали:
LM>>Здравствуйте, Hottabych1, Вы писали:
S>>>>Ещё советую проштудировать перегрузку оператора присваивания. S>>>>Тоже может пригодится на собеседовании. H>>>Так... пишу по памяти H>>>
H>>>A& A::operator=(const A &a)
H>>>{
H>>>......// А тут что?
H>>>}
H>>>
H>>>Полагаю, так... 0>AFAIR: 0>1. Возвращаемое значение может быть любым 0>2. Но лучше, чтобы оно было ссылкой на объект типа A (в данном случае) 0>3. В самом конце тогда уж (если выполнять п. 2)
return *this;
Могу ошибаться, но если возвращаемое значение — ссылка на объект типа A,
надо ещё сделать проверку на присваивание самому себе:
A& A::operator=(const A &a)
{
if (a != *this)
{
....
}
return *this;
}
S>Могу ошибаться, но если возвращаемое значение — ссылка на объект типа A, S> надо ещё сделать проверку на присваивание самому себе: S>
S>A& A::operator=(const A &a)
S>{
S> if (a != *this)
S> {
S> ....
S> }
S> return *this;
S>}
S>
Во-первых, эту проверку следует делать всегда, независимо от типа возвращаемого значения.
Во-вторых, это у вас проверка по значению, с вызовом operator!=(). Её тоже иногда используют, но в большинстве случае следует проверять равенство ссылок.
A& A::operator=(const A &a)
{
if (this != &a)
{
....
}
return *this;
}
H>>A& A::operator=(const A &a)
H>>{
H>>...
H>>}
H>>
H>>Полагаю, так...
THE>держи ещё вопросов: THE>- какова трудоёмкость поиска (значения по ключу) в stl контейнере map THE>- ну там, совсем банальные вопросы: чем отличаются раннее связывание от позднего, TCP от UDP, select от poll
Снова играю по памяти, MSDN под рукой, но в него не лезу.
Так... map — это вроде дерево... если несортированное, то сложность поиска ничем не отличается от обычных списков. Перебирать каждый элемент и втупую сравнивать. Это O(n). Если сортированный, то на каждом шаге можно половину элементов отбрасывать (решаем, какую ветку дерева выбрать — левую или правую). То есть, это будет O(log2 n).
Раннее связывание — во время компиляции, позднее — во время выполнения. TCP гарантирует доставку, UDP — нет, это как вещание. Про select и poll не знаю...
По сути согласен с вами, те кто проводил собеседование неправы, IMHO, прекратив его после ошибки в одном (пусть и простом вопросе). Вам не повезло, вы попали на маньяков . А может просто у них был такой огромный конкурс на эту вакансию.
меня тоже частенько грузят ООП, хотя в резюме я нигде его не пишу. как я понял это как таблица умножения -все это должны знать? и это проще всего спросить? или ценность есть в знании ООП, даже если нигде его не применял?
конечно если бы я каждый день его использовал, то может и помнил чтото, а так только из книжек без реальной практики
Не знаю, куда, может и в юмор. Но не смешно вообще...
Собеседование.
...
ПМ: Есть массив A. Необходимо отсортировать.
C: Дак есть же стандартный квиксорт.
ПМ: Ок, без проблем, давайте через квиксорт.
С: Дак я параметры не помню. Да и вообще, их за 30 секунд в MSDN посмотреть можно.
ПМ: Ок, без проблем. Вот компьютер, вот студия...
С: 1.сек.
ПМ: Ок не буду вас отвлекать. (отходит от компьютера)
.... спустя 15 минут ...
С: Готово.
ПМ: Отлично!
Смотрим код:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
const int c = 10;
int[] A = new int[c] {12, 123, 534, 123, 76, 34, 56, 23, 67, 34};
//qsort((void*)A, (size_t)A, sizeof(int), compare);for (int i = 0; i < c; i++) {
for (int j = i; j < c; j++) {
if (A[i] < A[j]) {
int buf = A[i];
A[i] = A[j];
A[j] = buf;
}
}
}
for (int i = 0; i < c; i++) {
Console.WriteLine(A[i]);
}
}
/*
int compare( const void *arg1, const void *arg2 )
{
return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );
}
*/
}
}
ПМ: А где же квиксо... А, понял... в комментариях...
Занавес.
Здравствуйте, Hottabych1, Вы писали:
THE>>держи ещё вопросов: THE>>- какова трудоёмкость поиска (значения по ключу) в stl контейнере map H>Снова играю по памяти, MSDN под рукой, но в него не лезу. H>Так... map — это вроде дерево... если несортированное, то сложность поиска ничем не отличается от обычных списков. Перебирать каждый элемент и втупую сравнивать. Это O(n). Если сортированный, то на каждом шаге можно половину элементов отбрасывать (решаем, какую ветку дерева выбрать — левую или правую). То есть, это будет O(log2 n).
Слив защитан. map всегда отсортирован
Здравствуйте, enzo, Вы писали:
S>> надо ещё сделать проверку на присваивание самому себе: E>Во-первых, эту проверку следует делать всегда, независимо от типа возвращаемого значения.
Тут уже показывали фокус со swap. И никаких проверок не нужнл
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, Hottabych1, Вы писали:
THE>>>держи ещё вопросов: THE>>>- какова трудоёмкость поиска (значения по ключу) в stl контейнере map H>>Снова играю по памяти, MSDN под рукой, но в него не лезу. H>>Так... map — это вроде дерево... если несортированное, то сложность поиска ничем не отличается от обычных списков. Перебирать каждый элемент и втупую сравнивать. Это O(n). Если сортированный, то на каждом шаге можно половину элементов отбрасывать (решаем, какую ветку дерева выбрать — левую или правую). То есть, это будет O(log2 n). LM>Слив защитан. map всегда отсортирован
Ага, глянул в доку и увидел, что map всегда сортирован, но было поздно — уже ответил
Здравствуйте, Hottabych1, Вы писали:
LM>>Слив защитан. map всегда отсортирован H>Ага, глянул в доку и увидел, что map всегда сортирован, но было поздно — уже ответил
Еще один воспрос: даны std::vector<int> и std::list<int>
Как наиболее быстрым способом найти в них число 10? Сколько операций для этого потребуется О?
P.S. В доку не смотреть
P.S.S. Рассмотреть оба случая: контейнеры сортированы\несортированы
Одобрямс.
КД>Правда в последнее время, мне в голову все чаще и чаще приходя мысли, что проектировать классы нужно так, чтобы у них вообще не было реализаций конструкторов и операторов копирования.
Здравствуйте, enzo, Вы писали:
]
E>Во-первых, эту проверку следует делать всегда, независимо от типа возвращаемого значения. E>Во-вторых, это у вас проверка по значению, с вызовом operator!=(). Её тоже иногда используют, но в большинстве случае следует проверять равенство ссылок.
E>
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, enzo, Вы писали:
S>>> надо ещё сделать проверку на присваивание самому себе: E>>Во-первых, эту проверку следует делать всегда, независимо от типа возвращаемого значения. LM>Тут уже показывали фокус со swap. И никаких проверок не нужнл
T& T::operator = (const T& x)
{
T tmp(x); // Copy constructorthis->swap(tmp); // NO EXCEPTIONS !!!return *this;
}//T::copy operator
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, Hottabych1, Вы писали:
LM>>>Слив защитан. map всегда отсортирован H>>Ага, глянул в доку и увидел, что map всегда сортирован, но было поздно — уже ответил :) LM>Еще один воспрос: даны std::vector<int> и std::list<int>
LM>Как наиболее быстрым способом найти в них число 10? Сколько операций для этого потребуется О?
LM>P.S. В доку не смотреть LM>P.S.S. Рассмотреть оба случая: контейнеры сортированы\несортированы
так, в доки не смотрим... :)
несортированы: одинаково для vector и list: find (i->start (), i->end (), 10) , O(n)
сортированы:
вектор: O (log_2(n)), методом деления вектора пополам (код очевиден, в стандартных алгоритмах не помню, наверно, есть)
list: O (n), тупым перебором, например, find
Здравствуйте, THESERG, Вы писали:
THE>Здравствуйте, LuciferMoscow, Вы писали:
LM>>Здравствуйте, Hottabych1, Вы писали:
LM>>>>Слив защитан. map всегда отсортирован H>>>Ага, глянул в доку и увидел, что map всегда сортирован, но было поздно — уже ответил LM>>Еще один воспрос: даны std::vector<int> и std::list<int>
LM>>Как наиболее быстрым способом найти в них число 10? Сколько операций для этого потребуется О?
LM>>P.S. В доку не смотреть LM>>P.S.S. Рассмотреть оба случая: контейнеры сортированы\несортированы
THE>так, в доки не смотрим... THE>несортированы: одинаково для vector и list: find (i->start (), i->end (), 10) , O(n) THE>сортированы: THE>вектор: O (log_2(n)), методом деления вектора пополам (код очевиден, в стандартных алгоритмах не помню, наверно, есть) THE>list: O (n), тупым перебором, например, find
Поддерживаю и в доки тоже не смотрю.
Здравствуйте, Hottabych1, Вы писали:
H>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь...
А не напрягайся. Вдиимо — для данной конкретной компании важно. Ибо они тут заказывают музыку.
Если ты считаешь, что это не важно — ищи другую компанию, в которой считают так же как ты. Лучше сработаетесь Меньше шансов взаимонепонимания в дальнейшей работе
Здравствуйте, jazzer, Вы писали:
J>Конструктор копирования — это конструктор с одним параметром-ссылкой на тот же самый класс. J>Константная это ссылка или нет — не важно.
Более того, передача по значению в конструкторе — это по сингнатуре тоже конструктор копирования! Просто так уж получилось в результате всех этих извилистых путей дизайна языка, что он приводит к бесконечной рекурсии. Типичный случай наступания себе на хвост.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, Hottabych1, Вы писали:
H>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут . Как? Очень просто — нервы + забыл элементарную вещь. H>Первый вопрос был написать класс и наследуемый от него. Сделал. Второй вопрос — про приведение типов. Ответил. Третий вопрос был фатальным. Угадайте, какой... написать для данного класса конструктор копирования. Ну забыл я, забыл! H>Написал дрожащими руками вот такое:
H>
H>A::A(A a)
H>{
H>...
H>}
H>
H>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
Базовые моменты: написание конструктора копирования, перегрузку операций, etc
конечно надо знать и главное — понимать.Но ИМХО — работодателю стоит ещё и оценить, как человек
мыслит, подходит к решению задачи.Может быть в одном и проиграет, зато выиграет в другом.
Здравствуйте, branco, Вы писали:
B>Базовые моменты: написание конструктора копирования, перегрузку операций, etc B>конечно надо знать и главное — понимать.Но ИМХО — работодателю стоит ещё и оценить, как человек B>мыслит, подходит к решению задачи.Может быть в одном и проиграет, зато выиграет в другом.
А если нужен senior?
Здравствуйте, DKM_MSFT, Вы писали:
DKM>Здравствуйте, 0xd34df00d, Вы писали:
0>>>>А по-моему, есть вещи, которые нельзя забывать никогда, как таблицу умножения... А еще есть вещи, говорящие о непонимании практически базовых концепций и принципов. И соискатель, может быть, прав в данной ситуации — ему нужно получить наиболее хорошо знающего работника.
DKM>У меня как-то был период, когда мне, в силу специфики проекта, приходилось писать код на 5 разных языках. Так я иногда синтаксис цикла for забывал для какого-нибудь языка, не говоря уже про более сложные вещи. Цикл for — это, вроде как, базовая концепция. Говорит ли это о том, что я ее не понимаю и мне пора на свалку?
Как сказал коллега — есть 2 типа программистов — одни знают всю теорию, другие ничего не помнят, смотрят как написано другими (или собой же ранее) и адаптируют конструкцию. Не факт, что вторые не имеют права на существование.
Любой язык забывается очень быстро при неиспользовании. Для второй категории написать что-нибудь внятное вне привычной среды (на бумажке) вообще пытке подобно (еще + нервы)- и выходят неуклюжие .... класс А фигурная скобка — молчание — ерзание ручкой — и какой нафиг конструктор копирования.
Зато механическая память (открывание файла предыдущего проекта, где был использован данный прием, контрол-пробел в "студии", позвлояющий дописать оператор, мастеры-визарда вполне позволяют им творить.
Естественно, на теоретических собеседованиях вторая группа бракуется и идет в отстой.
а я както завалил (один из провальных ответов) по другой причине связаной с ООП. я совсем забыл, что по умолчанию не только деструктор и конструктор без параметров создаются. просто вот както в жизни привык не доверять таким вот "по умолчанию" методам. привык описывать, если они нужны, "ручками".
..за привычку поплатился как говорится
ЗЫ: конечно, порой выводит из себя, что собеседуют по таким вещам, которые применяешь, но теорию по ним рассказать толком не можешь только на пальцах.. но сие похоже только моя проблема.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, minorlogic, Вы писали:
M>>Почему воторой вариант лучше
КД>Курите тему исключений и атомарного перевода объекта из одного состояния в другое.
Это вы мне решили викторину организовать ? при чем тут атомарность , при чем тут исключения ? Вопрос был довольно конкретным.
M>>и что делает функция swap ?
КД>Обмен состояний объектов. Типа std::swap, но в рамках конкретного класса.
Здравствуйте, Sni4ok, Вы писали:
S>да ты просто неудачник — если на такой вопрос ответить не смог.
ЭйчАр одной крупной инвестиционной компании при рассмотрении резюме кандидатов, половину всегда выбрасывал не рассматривая, приговаривая при этом — "Неудачники нам не нужны!"
(C)тарая шутка.
Здравствуйте, fGordon, Вы писали:
G>сабж.
G> просто вот както в жизни <привык не доверять таким вот "по умолчанию" методам>. <привык описывать, если они нужны, "ручками">.
Что-то я не понял зависимости между первым и вторым
Реально полезной привычкой, при определении плюсового класса, является немедленное помещение конструктора и операратора копирования в private секцию. Я, к примеру, приучил себя в 99.9% случаев писать так
class T
{
private:
typedef T self_type;
T(const self_type&);
self_type& operator = (const self_type&);
public:
//Тут, типа, что-угодно
};//class T
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
G>> просто вот както в жизни <привык не доверять таким вот "по умолчанию" методам>. <привык описывать, если они нужны, "ручками">. КД>Что-то я не понял зависимости между первым и вторым
Что не понятного? Я опишу конструктор копии руками. Я не буду использовать конструктор копии "дефолтовый".
Как еще объяснить, я не знаю...
КД>Реально полезной привычкой, при определении плюсового класса, является немедленное помещение конструктора и операратора копирования в private секцию. Я, к примеру, приучил себя в 99.9% случаев писать так
Это уже частичный оффтопик
Здравствуйте, minorlogic, Вы писали:
КД>>Курите тему исключений и атомарного перевода объекта из одного состояния в другое.
M>Это вы мне решили викторину организовать ? при чем тут атомарность , при чем тут исключения ? Вопрос был довольно конкретным.
Какая викторина
В первом варианте на эти две вещи положен ... ну вообщем, понятно, что на них положили. А во втором случае, обеспечивается "все или ничего". То есть — либо мы полностью переведем объект в новое состояние, либо (в случае исключений при копировании членов) он сохранит свое старое состояние.
Поэтому второй вариант лучше.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, fGordon, Вы писали:
G>>> просто вот както в жизни <привык не доверять таким вот "по умолчанию" методам>. <привык описывать, если они нужны, "ручками">. КД>>Что-то я не понял зависимости между первым и вторым G>Что не понятного? Я опишу конструктор копии руками. Я не буду использовать конструктор копии "дефолтовый". G>Как еще объяснить, я не знаю...
Ну да. А если мне конструктор копирования не нужен, то "я не напишу его руками"? И, типа, возьму на себя ответственность, что в коде программы не возникнет ситуации, провоцирующей компилятор сгенерировать оный ?
КД>>Реально полезной привычкой, при определении плюсового класса, является немедленное помещение конструктора и операратора копирования в private секцию. Я, к примеру, приучил себя в 99.9% случаев писать так G>Это уже частичный оффтопик
Факт
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, minorlogic, Вы писали:
M>>Почему воторой вариант лучше
КД>Курите тему исключений и атомарного перевода объекта из одного состояния в другое.
M>>и что делает функция swap ?
КД>Обмен состояний объектов. Типа std::swap, но в рамках конкретного класса.
Нет, ну Сатер конечно дядька умный, не спорю, только вот одно НО, это ж надо иметь тот самый
swap
, который исключений не генерирует, да и вообще свапает. Вот вам дефолтная STLная реализация из VC 2003
как видите она использует и конструктор копирования и оператор присваивания... т.е. её нельзя использовать для их реализации ибо выйдет рекурсия, надобно иметь свою собственную.. а что делать в своей собственной кроме
Вобщем описанный выше метод работает красиво и непритянуто за уши только если вы используете handle-body идиому... а Вы её в каждом классе используете? в каждом в котором нужен конструктор копирования???? неверю!
Здравствуйте, Коваленко Дмитрий, Вы писали:
G>>>> просто вот както в жизни <привык не доверять таким вот "по умолчанию" методам>. <привык описывать, если они нужны, "ручками">. КД>>>Что-то я не понял зависимости между первым и вторым G>>Что не понятного? Я опишу конструктор копии руками. Я не буду использовать конструктор копии "дефолтовый". G>>Как еще объяснить, я не знаю...
КД>Ну да. А если мне конструктор копирования не нужен, то "я не напишу его руками"? И, типа, возьму на себя ответственность, что в коде программы не возникнет ситуации, провоцирующей компилятор сгенерировать оный ?
Ну да
Если он не нужен — то мне и не суть важно, сгенерирован он или нет. Если понадобится, я опишу его руками.
V> — слышал но ничего рассказать не могу V> — а привести примеры реализации V> — если я не могу рассказать про патерн то как по вашему я могу рассказать про его реализацию V> — а подумать не хотите V> — нет не хочу
V>вопрос — что такое полиморфизм знаете V>ответ — что-то припоминаю, но толком рассказать не могу
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Реально полезной привычкой, при определении плюсового класса, является немедленное помещение конструктора и операратора копирования в private секцию. Я, к примеру, приучил себя в 99.9% случаев писать так
КД>
КД>class T
КД>{
КД> private:
КД> typedef T self_type;
А вот меня всегда интересовало, зачем делается такая штука?
Здравствуйте, superman, Вы писали:
S>Вобщем описанный выше метод работает красиво и непритянуто за уши только если вы используете handle-body идиому... а Вы её в каждом классе используете? в каждом в котором нужен конструктор копирования???? неверю!
Вообще говоря "в каждом где нужен оператор копирования"
Я там выше написал
Правда в последнее время, мне в голову все чаще и чаще приходя мысли, что проектировать классы нужно так, чтобы у них вообще не было реализаций конструкторов и операторов копирования.
Если объекты класса с оператором копирования живут очень долго, то стараюсь делать именно так
Если же ошибка копирования однозначно приводит к уничтожению объекта (например, при раскручивании стека во время исключения), то, ясный пфенинг, забиваю
Вообще говоря, эти мелочи ложаться в основу проектов / конструкций, от сложности которых рвет на Родину. Поэтому не стоит их игнорировать, считая бестолквыми глупостями.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
К собеседованию нужно готовиться, как к экзамену. Синтетические задачи и вопросы имеют свою спицифику. Работая на настоящей работе можно за 5 лет не написать ни одного конструктора копирования, ни одного const метода, не описать ни одного указателя на функцию, тем более метод класса. Но экзаменатор, если не всю муть, то уж добрую половину точно припомнит. Так что перед сменой работы Страуструпа читать от корки до корки однозначно.
Здравствуйте, Olegator, Вы писали:
КД>>Реально полезной привычкой, при определении плюсового класса, является немедленное помещение конструктора и операратора копирования в private секцию. Я, к примеру, приучил себя в 99.9% случаев писать так
КД>>
КД>>class T
КД>>{
КД>> private:
КД>> typedef T self_type;
O>
O>А вот меня всегда интересовало, зачем делается такая штука?
Для поддержки китайской технологии copy&paste.
Или для того, чтобы сократить писанину в случае классов с километовыми именами.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, fGordon, Вы писали:
G>Ну да G>Если он не нужен — то мне и не суть важно, сгенерирован он или нет. Если понадобится, я опишу его руками.
G>ЗЫ: к чему полемика то?
К тому, что при профессиональном программировании на C++ такое не допустимо.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>К тому, что при профессиональном программировании на C++ такое не допустимо.
Какое недопустимо?
Объясните, что мне инкриминируется то?
Пример из жизни:
Есть класс, который делает чтото. Я не пишу конструктор копии. Он создается "атовматом". Ок, с этим все понятно.
По мере написания программы, мне захотелось использовать конструктор копии (КК) для этого класса. Я пишу его "в ручную" и делаю в нем какие то дополнительные фичи, необходимые мне и которые КК конечно же не сделает для меня сам, ибо он не умеет читать мысли
А допольнительные операции в КК приходится делать в 99% случаев, ибо это жизнь, а не теория.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, minorlogic, Вы писали:
КД>>>Курите тему исключений и атомарного перевода объекта из одного состояния в другое.
M>>Это вы мне решили викторину организовать ? при чем тут атомарность , при чем тут исключения ? Вопрос был довольно конкретным.
КД>Какая викторина
КД>В первом варианте на эти две вещи положен ... ну вообщем, понятно, что на них положили. А во втором случае, обеспечивается "все или ничего". То есть — либо мы полностью переведем объект в новое состояние, либо (в случае исключений при копировании членов) он сохранит свое старое состояние.
КД>Поэтому второй вариант лучше.
Понял , то есть вы хотите и дельше использовать объект в старом состоянии, если вы его не смогли изменить. Часто вам такая возможность нужна ?
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, minorlogic, Вы писали:
КД>>>Курите тему исключений и атомарного перевода объекта из одного состояния в другое.
M>>Это вы мне решили викторину организовать ? при чем тут атомарность , при чем тут исключения ? Вопрос был довольно конкретным.
КД>Какая викторина
КД>В первом варианте на эти две вещи положен ... ну вообщем, понятно, что на них положили. А во втором случае, обеспечивается "все или ничего". То есть — либо мы полностью переведем объект в новое состояние, либо (в случае исключений при копировании членов) он сохранит свое старое состояние.
КД>Поэтому второй вариант лучше.
Еще меня удивляет , как Вы обеспечите то , что swap не кинет исключения , если обычное почленное копирование такую возможность предусматривает, используется некий механизм ?
Здравствуйте, fGordon, Вы писали:
G>Какое недопустимо?
Просто программеры часто придерживаются правила: что не запрещено, то разрешено. Т.е. другие программеры пользуя твой код могут просто не подозревать, что конструктор копирования — это лажа от компилятора, а не задуманная фича, и наломают дров, а потом тебе руки оторвут.
Если ты видишь, что конструктор по дефолту отработает нормально, то можно и не писать, а если не уверен, то лучше запретить от греха подальше, меньше проблем будет при работе в команде, да и сам не наступишь на свои грабли.
Здравствуйте, minorlogic, Вы писали:
КД>>Поэтому второй вариант лучше.
M>Понял , то есть вы хотите и дельше использовать объект в старом состоянии, если вы его не смогли изменить. Часто вам такая возможность нужна ?
Когда пишешь библиотечные вещи, насчет "как часто" не задумываешься
В реале — я очень часто пишу вещи которые именно так и работают. Причем речь идет не про одиночные объекты, а про целые хороводы. В основном, тема связана с базами данных.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Димчанский, Вы писали:
Д>Просто программеры часто придерживаются правила: что не запрещено, то разрешено. Т.е. другие программеры пользуя твой код могут просто не подозревать, что конструктор копирования — это лажа от компилятора, а не задуманная фича, и наломают дров, а потом тебе руки оторвут. Д>Если ты видишь, что конструктор по дефолту отработает нормально, то можно и не писать, а если не уверен, то лучше запретить от греха подальше, меньше проблем будет при работе в команде, да и сам не наступишь на свои грабли.
Мне мои руки нравятся, не надо их отрывать
По сути, КК по умолчанию будет так и так, и без моих написаний кода...
Вобщем, обсуждение перешло в разряд "если бы...". Я все же при написании кода ориентируюсь, что последователи моего кода — разумные и профессиональные люди. Просто так в моей жизни сложилось...
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, superman, Вы писали:
S>>Вобщем описанный выше метод работает красиво и непритянуто за уши только если вы используете handle-body идиому... а Вы её в каждом классе используете? в каждом в котором нужен конструктор копирования???? неверю!
КД>Вообще говоря "в каждом где нужен оператор копирования"
КД>Я там выше написал КД>
КД>Правда в последнее время, мне в голову все чаще и чаще приходя мысли, что проектировать классы нужно так, чтобы у них вообще не было реализаций конструкторов и операторов копирования.
КД>
КД>Если объекты класса с оператором копирования живут очень долго, то стараюсь делать именно так
э.. уж простите за занудство, мысль не уловил, как это "именно так"? handle-body или "так проэктировать, чтобы у них вообще не было реализаций конструкторов и операторов копирования."? и что заначит живут долго? как на меня оно скорее зависит от того надо ли их копировать а не живут ли они долго.
КД>Вообще говоря, эти мелочи ложаться в основу проектов / конструкций, от сложности которых рвет на Родину. Поэтому не стоит их игнорировать, считая бестолквыми глупостями.
+1
КД>Правда в последнее время, мне в голову все чаще и чаще приходя мысли, что проектировать классы нужно так, чтобы у них вообще не было реализаций конструкторов и операторов копирования.
КД>
Очень здравая мысль. Я считаю что такие весчи необходимо делать только в очень маленьком к-ве случаев , например смартпоинтер.
Для тривиальных , небиблиотечных классов — это дурной тон.
Здравствуйте, fGordon, Вы писали:
КД>>К тому, что при профессиональном программировании на C++ такое не допустимо.
G>Какое недопустимо? G>Объясните, что мне инкриминируется то?
G>Есть класс, который делает чтото. Я не пишу конструктор копии. Он создается "атовматом". Ок, с этим все понятно.
G>Так где я чтото делаю "не профессионально"?
Наверное, мы о разных вещах говорим. Я не про КК, а про оператор копирования, ошибка в котором может оставить объект в некорректном состоянии.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Имхо правильно что тебя не взяли. Какие проблемы ты можешь решать если не знаешь об инструментах решения...
H>Так... map — это вроде дерево... если несортированное, то сложность поиска ничем не отличается от обычных списков. Перебирать каждый элемент и втупую сравнивать. Это O(n). Если сортированный, то на каждом шаге можно половину элементов отбрасывать (решаем, какую ветку дерева выбрать — левую или правую). То есть, это будет O(log2 n). H>Раннее связывание — во время компиляции, позднее — во время выполнения. TCP гарантирует доставку, UDP — нет, это как вещание. Про select и poll не знаю...
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Наверное, мы о разных вещах говорим. Я не про КК, а про оператор копирования, ошибка в котором может оставить объект в некорректном состоянии.
путаница в терминологии. есть "equal operator" и есть "copy constructor". по крайней мере в данной ветке вроде про них шла речь. я же упоминал только КК
собсно поэтому я и не понимаю, в чем моя вина
Здравствуйте, minorlogic, Вы писали:
КД>>Поэтому второй вариант лучше.
M>Еще меня удивляет , как Вы обеспечите то , что swap не кинет исключения , если обычное почленное копирование такую возможность предусматривает, используется некий механизм? this->swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов. Считается, что swap не кидает исключений.
В первом варианте, при тупом по-членном копировании, мы могли скопировать половину объекта, а на второй произойдет ошибка. И все — ахтунг.
M>Я правильно понял что вы Сатера цитируете ?
Нет. Исключительно себя
Хотя, впрочем, про вторую технику копирования я прочитал в расширнном издании "Великого и Ужасного Страуструпа". Там две главы добавлено, в одной из которых и было это описано. Кажется.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, superman, Вы писали:
КД>>Если объекты класса с оператором копирования живут очень долго, то стараюсь делать именно так
S>э.. уж простите за занудство, мысль не уловил, как это "именно так"?
В смысле, оператор копирования через "конструктор копирования"+"swap"
S>handle-body или "так проэктировать, чтобы у них вообще не было реализаций конструкторов и операторов копирования."?
Мда. С терминологией у меня, как всегда, проблемы. handle-body — по русски что означает-то?
S>и что заначит живут долго? как на меня оно скорее зависит от того надо ли их копировать а не живут ли они долго.
Это значит, что этот объект живет не в рамках текущей операции, а был взят снаружи. Поэтому очень желательно, чтобы, не зависимо от результата выполнения этой операции, объект остался в корректном состоянии. Если у объекта есть оператор копирования (присваивания), то он должен обеспечивать атомарность.
Если же объект временный — то на все эти глупости можно забить. Даже если его состояние меняется десятки раз. Он же все равно, в конечном итоге, будет убит.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, egaron, Вы писали:
E>Как сказал коллега — есть 2 типа программистов
<skipped>
E>Естественно, на теоретических собеседованиях вторая группа бракуется и идет в отстой.
Знаете, многие тут, конечно, со мной не согласятся, но я считаю то, что вы называете теоретическим собеседованием, глупостью. С моей точки зрения человек, который отлично знает синтаксис переопределения оператора присваивания, досконально вызубрил operator precedence and associativity (простите, забыл как это по-русски), или даже во сне может назвать тип 7го параметра функции CreateFile, с практической точки зрения отличается от человека, который всего этого не помнит, только одним. А именно тем, что он будет быстрее писать код. За счет меньшего количества обращений к документации. Не больше и не меньше этого.
То есть "теоретическое собеседование" с точки зрения практической полезности находится на том же уровне, что и тест на скорость печатания на клавиатуре.
Оно не является доказательством ни того, что человек понимает хоть одну из написанных им конструкций, ни того, что он ее хоть раз в жизни применял. В бытность мою студентом второго курса я ради смеха прошел несколько brainbench-like теоретических тестов по разным языкам, при этом мои знания по некоторым из них сводились к однократному чтению учебника за день до прохождения теста и выяснения наиболее стандартных вопросов подобных тестов в интернете. Вы удивитесь, если узнаете, насколько хорошо я их тогда прошел.
В полной мере вышесказанное относится также к TOEFL-like тестам по английскому, которые я после некоторой тренировки замечательно проходил, понимая не более 10% текста и даже не улавливая общий его смысл, тестам на определение iq, которые с 5го раза проходятся на уровне гения, разного рода сертификациям и другим вещам, где можно играть на типичности вопросов и некоторых других факторах, к предмету вообще не относящихся.
Единственное, что действительно важно — это системный подход и наличие нестандартного мышления. Если человек обладает системным подходом, он одинаково здорово справится с вопросом о тестировании функции сортировки, тестировании корпоративной сети и тестировании шариковой ручки. Если у человека присутствует нестандартность мышления, он предложит лучший и более красивый способ решения задачи, чем человек, мыслящий шаблонами.
Поэтому на собеседованиях нужно спрашивать не написание конструктора копирования или реализацию паттерна singleton. Задайте ему хорошую нетипичную задачу "на подумать", которая к ним сводится. Все и выясните. А может быть, узнаете, как ее можно решить гораздо проще и эффективнее. Это если вам повезет наткнуться на действительно классного программиста. И какая разница, если где-то он пропустил "&", не поставил ";" или перепутал порядок следования операторов? В работе его спасет IDE, MSDN и google. А вот думать они его научить не смогут.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, minorlogic, Вы писали:
КД>>>Поэтому второй вариант лучше.
M>>Еще меня удивляет , как Вы обеспечите то , что swap не кинет исключения , если обычное почленное копирование такую возможность предусматривает, используется некий механизм? КД> this->>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов. Считается, что swap не кидает исключений.
КД>В первом варианте, при тупом по-членном копировании, мы могли скопировать половину объекта, а на второй произойдет ошибка. И все — ахтунг.
Ок. А если половина объекта просвопируется а половина нет ? Выброс исключения , и в чем преимущество.
Здравствуйте, minorlogic, Вы писали:
this->>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов.
---> Считается, что swap не кидает исключений. <-----
M>Ок. А если половина объекта просвопируется а половина нет ? Выброс исключения , и в чем преимущество.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, DKM_MSFT, Вы писали:
DKM>Знаете, многие тут, конечно, со мной не согласятся, но я считаю то, что вы называете теоретическим собеседованием, глупостью.
[skip]
А я вот покажу, что в такой глупости есть доля смысла. Дело в том, что на собеседование может прийти:
1. Полный профан, который не имеет реального опыта и даже не потрудился вызубрить синтаксис.
2. Человек, имеющий опыт. Т.к. он много всякого написал на C++, у него ужё до автоматизма дошли такие вещи.
3. Человек без реального опыта, но хорошо вызубривший синтаксис С++ (а так же ООП-терминологию, паттерны и т.д.)
В идеале хотелось бы взять (2). Но не всегда можно понять, то ли человек имеет реальный опыт, то ли он вызубрил. Так хотя бы собеседование позволяет отсеять группу (1), что тоже не так уж плохо. Да и неизвестно, что получится с вариантом (3). Может, он окажется пустышкой и испытательный срок это покажет. А может, у человека по объективны причинам не было опыта (мало ли, может он из другого города, где совершенно нет никакого IT) и на испытательном сроке он покажет способности к обучению, получит минимальный опыт.
А вообще, кто знает универсальную и абсолютно точную методологию выявляения класса (2), пусть первым кинет в меня камнем. Так уж устроен мир.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, minorlogic, Вы писали:
this->>>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов.
--->> Считается, что swap не кидает исключений. <-----
M>>Ок. А если половина объекта просвопируется а половина нет ? Выброс исключения , и в чем преимущество.
Я понимаю , но какое именно метафизическое свойство нам гарантирует что своп не выкинет исключения ? У кого считается ? Какой механизм нам позволит делать своп для произвольных мемберов ?
Здравствуйте, minorlogic, Вы писали:
M>Очень здравая мысль. Я считаю что такие весчи необходимо делать только в очень маленьком к-ве случаев , например смартпоинтер. M>Для тривиальных , небиблиотечных классов — это дурной тон.
Аргументы?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, minorlogic, Вы писали:
this->>>>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов.
--->>> Считается, что swap не кидает исключений. <-----
M>>>Ок. А если половина объекта просвопируется а половина нет ? Выброс исключения , и в чем преимущество.
M>Я понимаю , но какое именно метафизическое свойство нам гарантирует что своп не выкинет исключения ? У кого считается ? Какой механизм нам позволит делать своп для произвольных мемберов ?
Выносишь состояние объекта в отдельный класс, объекты которого создаются динамически (в куче).
swap состояний сведется к обмену указателей на них
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
this->>>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов. --->> Считается, что swap не кидает исключений. <-----
23.1.10:
— no swap() function throws an exception unless that exception is thrown by the copy constructor or
assignment operator of the container’s Compare object (if any; see 23.1.2).
По-моему, вы все напутали, и правильный оператор копирования реализуется немного не так. Нужно использовать не swap самого объекта, а по очереди swap каждого члена класса. А соответственно каждый член класса должен тоже иметь exception-safe конструктор копирования и оператор копирования.
Здравствуйте, i-maverick, Вы писали:
this->>>>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов. --->>> Считается, что swap не кидает исключений. <-----
IM>23.1.10: IM>— no swap() function throws an exception unless that exception is thrown by the copy constructor or IM>assignment operator of the container’s Compare object (if any; see 23.1.2).
IM>По-моему, вы все напутали, и правильный оператор копирования реализуется немного не так. Нужно использовать не swap самого объекта, а по очереди swap каждого члена класса. А соответственно каждый член класса должен тоже иметь exception-safe конструктор копирования и оператор копирования.
Вообще говоря, вы бы лучше маленький пример "правильного оператора копирования" привели... А то мне кажется что вы просто пытаетесь придавить меня интеллектом
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, superman, Вы писали:
S>Здравствуйте, Коваленко Дмитрий, Вы писали:
S>мысль понял, благодарю
КД>>Мда. С терминологией у меня, как всегда, проблемы. handle-body — по русски что означает-то?
S>дык S>
S>Выносишь состояние объекта в отдельный класс, объекты которого создаются динамически (в куче).
Здравствуйте, konsoletyper, Вы писали:
K>Здравствуйте, DKM_MSFT, Вы писали:
DKM>>Знаете, многие тут, конечно, со мной не согласятся, но я считаю то, что вы называете теоретическим собеседованием, глупостью.
K>[skip]
K>А я вот покажу, что в такой глупости есть доля смысла. Дело в том, что на собеседование может прийти:
K>1. Полный профан, который не имеет реального опыта и даже не потрудился вызубрить синтаксис. K>2. Человек, имеющий опыт. Т.к. он много всякого написал на C++, у него ужё до автоматизма дошли такие вещи. K>3. Человек без реального опыта, но хорошо вызубривший синтаксис С++ (а так же ООП-терминологию, паттерны и т.д.)
K>В идеале хотелось бы взять (2). Но не всегда можно понять, то ли человек имеет реальный опыт, то ли он вызубрил.
Вызубрить можно только Yes/No вопросы (ну и чисто синтаксис), которые дают на тестах. Дайте человеку вопрос на понимание (например, код с ошибкой), заставьте его думать и тут вы его раскроете.
K> Так хотя бы собеседование позволяет отсеять группу (1), что тоже не так уж плохо. Да и неизвестно, что получится с вариантом (3). Может, он окажется пустышкой и испытательный срок это покажет. А может, у человека по объективны причинам не было опыта (мало ли, может он из другого города, где совершенно нет никакого IT) и на испытательном сроке он покажет способности к обучению, получит минимальный опыт.
Ну (1) сразу отсеивается. (3) можно отсеять следующим образом: попросите его предолжить решение небольшой проблемы и аргументировать почему надо действовать так а не иначе. Какой паттерн лучше применить, заставьте его рассуждать. Ну и естественно надо дать задание на написание кода (на компьютере с MSDN/man/Internet), вплоть до банальщины — деревья, сортировки, строки. По стилю уже многое ясно (проверки на ошибки, внятность наименования переменных, хотя бы).
Ну и надо применять банальную логику — проанализируйте что человеку предполагается делать у вас в компании и спрашивайте соответствующие use-case — микрозадачи, возникающих в течение дня.
K>А вообще, кто знает универсальную и абсолютно точную методологию выявляения класса (2), пусть первым кинет в меня камнем.
Посмотреть резюме с указанием предыдущих мест работы ?
Здравствуйте, minorlogic, Вы писали:
M>Понял , то есть вы хотите и дельше использовать объект в старом состоянии, если вы его не смогли изменить. Часто вам такая возможность нужна ?
Это что-то вроде мини-транзакционности (то есть либо Commit — объект в новом состоянии, либо Rollback — остался в старом). Для надежных систем может быть нужна. Слышал, что в том же Яндексе такое спрашивают.
Здравствуйте, minorlogic, Вы писали:
M>Я понимаю , но какое именно метафизическое свойство нам гарантирует что своп не выкинет исключения ? У кого считается ? Какой механизм нам позволит делать своп для произвольных мемберов ?
swap просто побитно обменивает содержимое объектов, какие тут исключения. Это корректно, если в этот момент эти объекты залочены (т.е. нельзя будет из другого потока обратиться к наполовину сменившим состояние объектам).
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Реально полезной привычкой, при определении плюсового класса, является немедленное помещение конструктора и операратора копирования в private секцию. Я, к примеру, приучил себя в 99.9% случаев писать так
КД>
КД>class T
КД>{
КД> private:
КД> typedef T self_type;
КД> T(const self_type&);
КД> self_type& operator = (const self_type&);
КД> public:
КД> //Тут, типа, что-угодно
КД>};//class T
КД>
А зачем каждый раз писать? Лучше так:
#include <boost/utility.hpp>
class T : boost::noncopyable
{
...
Здравствуйте, Kemsky, Вы писали:
K>Работая на настоящей работе можно за 5 лет не написать ни одного конструктора копирования,
+-1. Это все-таки довольно распространенная вещь.
K> ни одного const метода,
-1. Это очень желательно применять как можно чаще.
K> не описать ни одного указателя на функцию, тем более метод класса.
+1
K> Но экзаменатор, если не всю муть, то уж добрую половину точно припомнит.
Если экзаменатор вменяемый для него незнание синтаксиса указателей на метод класса не будет решающим аргументом.
K> Так что перед сменой работы Страуструпа читать от корки до корки однозначно.
Или перейти на C#/Java .
Здравствуйте, Коваленко Дмитрий, Вы писали:
this->>>>>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов. --->>>> Считается, что swap не кидает исключений. <-----
IM>>По-моему, вы все напутали, и правильный оператор копирования реализуется немного не так. Нужно использовать не swap самого объекта, а по очереди swap каждого члена класса. А соответственно каждый член класса должен тоже иметь exception-safe конструктор копирования и оператор копирования.
КД>Вообще говоря, вы бы лучше маленький пример "правильного оператора копирования" привели... А то мне кажется что вы просто пытаетесь придавить меня интеллектом
Нет, совершенно не пытаюсь. Просто у вас тут уже целая ветка выросла из-за непонимания. Вот мне и стало интересно. Мне сейчас вообще кажется, что мы с вами говорим об одном и том же, просто вы что-то не договариваете.
Здравствуйте, i-maverick, Вы писали:
IM>Нет, совершенно не пытаюсь. Просто у вас тут уже целая ветка выросла из-за непонимания. Вот мне и стало интересно. Мне сейчас вообще кажется, что мы с вами говорим об одном и том же, просто вы что-то не договариваете.
class Safe
{
//...
}
А теперь, предположим, нужно предоставить просто метод для обмена состояний объектов или специализацию std::swap ... получается что выделенный, собственный Safe::swap не такая уж бесполезная вещь
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, i-maverick, Вы писали:
IM>Нет, совершенно не пытаюсь. Просто у вас тут уже целая ветка выросла из-за непонимания. Вот мне и стало интересно. Мне сейчас вообще кажется, что мы с вами говорим об одном и том же, просто вы что-то не договариваете.
IM>
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>А теперь, предположим, нужно предоставить просто метод для обмена состояний объектов или специализацию std::swap ... получается что выделенный, собственный Safe::swap не такая уж бесполезная вещь
А вот отсюда и пошло непонимание. Вы просто сказали, что есть некий Safe::swap метод, который по определению не кидает исключений. А про то, как вы его планируете реализовывать, скромно умалчиваете.
Здравствуйте, Андрей Хропов, Вы писали:
АХ>Здравствуйте, minorlogic, Вы писали:
M>>Я понимаю , но какое именно метафизическое свойство нам гарантирует что своп не выкинет исключения ? У кого считается ? Какой механизм нам позволит делать своп для произвольных мемберов ?
АХ>swap просто побитно обменивает содержимое объектов, какие тут исключения. Это корректно, если в этот момент эти объекты залочены (т.е. нельзя будет из другого потока обратиться к наполовину сменившим состояние объектам).
Поясните как я побитово поменяю мембера , некого CString ? а если класс завязан на указатели на себя или мемберов ?
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, minorlogic, Вы писали:
this->>>>>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов.
--->>>> Считается, что swap не кидает исключений. <-----
M>>>>Ок. А если половина объекта просвопируется а половина нет ? Выброс исключения , и в чем преимущество.
M>>Я понимаю , но какое именно метафизическое свойство нам гарантирует что своп не выкинет исключения ? У кого считается ? Какой механизм нам позволит делать своп для произвольных мемберов ?
КД>Выносишь состояние объекта в отдельный класс, объекты которого создаются динамически (в куче).
КД>swap состояний сведется к обмену указателей на них
То есть такой трюк с обычными классами не проходит , а только с некими пимплами ? Ну чесно говоря для пимплов я конструктор копирования напишу в строчку и безопасно с точки зрения исключений. Действительно , лишь скопировать указатель.
Здравствуйте, i-maverick, Вы писали:
КД>>А теперь, предположим, нужно предоставить просто метод для обмена состояний объектов или специализацию std::swap ... получается что выделенный, собственный Safe::swap не такая уж бесполезная вещь
IM>А вот отсюда и пошло непонимание. Вы просто сказали, что есть некий Safe::swap метод, который по определению не кидает исключений. А про то, как вы его планируете реализовывать, скромно умалчиваете.
this->swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов. Считается, что swap не кидает исключений.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
IM>А вот отсюда и пошло непонимание. Вы просто сказали, что есть некий Safe::swap метод, который по определению не кидает исключений. А про то, как вы его планируете реализовывать, скромно умалчиваете.
Здравствуйте, Hottabych1, Вы писали:
H>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут . Как? Очень просто — нервы + забыл элементарную вещь.
Не нужно нервничать перед собеседованием. Вы ж не студент перед экзаменом все-таки.
H>Написал дрожащими руками вот такое:
Да зачем дрожащие руки-то? Это что, первое собеседование в жизни, ведь нет же! Имхо, после 5 собеседований уже никогда не будешь волноваться и нервничать.
H>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
Лично мне не хотелось бы работать в команде с человеком, который ошибается в простых вещах. Даже если он мега-эксперт в каких-то там нестандартных задачах. Но это опять же верно не для всех команд/не для всех работодателей (а вдруг у кого выбора иного нет).
Не расстраивайтесь, полистайте Мейерса хотя бы (даже если в текущей работе вам все это не нужно). Эти книжки попроще, чем Страуструп. А то Страуструпа читают-то многие, да вот понимают/запоминают процентов 30.
И помните, что неудачным собеседованием жизнь не заканчивается.
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, minorlogic, Вы писали:
M>>Очень здравая мысль. Я считаю что такие весчи необходимо делать только в очень маленьком к-ве случаев , например смартпоинтер. M>>Для тривиальных , небиблиотечных классов — это дурной тон.
AJD>Аргументы?
Да все просто , ручное манипулирование в таких конструкциях ( ресурсов , поведения) может вести к очень неприятным багам.
Обычно же я наблюдаю совершенно мерзкое использование перегрузки. Для ручного управления ресурсами и т.п. Хотя конечно это делается надежнее с помощью отдельных спецефичных сущностей , смартпоинтеры и т.п.
K>>А вообще, кто знает универсальную и абсолютно точную методологию выявляения класса (2), пусть первым кинет в меня камнем.
АХ>Посмотреть резюме с указанием предыдущих мест работы ?
У меня стойкое ощущение, что Вы еще слишком молоды
КД>>Выносишь состояние объекта в отдельный класс, объекты которого создаются динамически (в куче).
КД>>swap состояний сведется к обмену указателей на них
M>То есть такой трюк с обычными классами не проходит , а только с некими пимплами ?
Это скорее следствие использования этих самых пимплов.
M>Ну чесно говоря для пимплов я конструктор копирования напишу в строчку и безопасно с точки зрения исключений. Действительно , лишь скопировать указатель.
-1. вот кстати конструктор копирования какраз таки в приведённой схеме может, и пожалуй должен выполнять глубокое копирование имплов, и может при этом генераровать искоючения..
Здравствуйте, fGordon, Вы писали:
G>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>К тому, что при профессиональном программировании на C++ такое не допустимо.
G>Какое недопустимо? G>Объясните, что мне инкриминируется то?
G>Пример из жизни: G>Есть класс, который делает чтото. Я не пишу конструктор копии. Он создается "атовматом". Ок, с этим все понятно. G>По мере написания программы, мне захотелось использовать конструктор копии (КК) для этого класса. Я пишу его "в ручную" и делаю в нем какие то дополнительные фичи, необходимые мне и которые КК конечно же не сделает для меня сам, ибо он не умеет читать мысли G>А допольнительные операции в КК приходится делать в 99% случаев, ибо это жизнь, а не теория.
G>Так где я чтото делаю "не профессионально"?
То что этот конструктор может быть вызывается неявно в некоторых случаях и если объект содержит указатель, то при удалении копии нас ждет сюрприз. Мало того, если я пользуюсь чужим кодом, то я предполагаю не нарвусь на растяжку.
Т.е. либо есть возможность копировать и она работает, либо копировать нельзя. Промежуточные состояния приводят к трате чужих нервов(своих?), особенно если глюк не проявился в отладке, но релиз убил.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Здравствуйте, Андрей Хропов, Вы писали:
АХ>Ну (1) сразу отсеивается. (3) можно отсеять следующим образом: попросите его предолжить решение небольшой проблемы и аргументировать почему надо действовать так а не иначе. Какой паттерн лучше применить, заставьте его рассуждать. Ну и естественно надо дать задание на написание кода (на компьютере с MSDN/man/Internet), вплоть до банальщины — деревья, сортировки, строки. По стилю уже многое ясно (проверки на ошибки, внятность наименования переменных, хотя бы).
Таким образом с (3) можно отсеять и многих (2). Часто такие "творческие" задачи могут быть элементарыми для одного, но совершенно неочевидными для другого — интуиция штука капризная.
K>>А вообще, кто знает универсальную и абсолютно точную методологию выявляения класса (2), пусть первым кинет в меня камнем.
АХ>Посмотреть резюме с указанием предыдущих мест работы ?
Не всегда работает — может, человек пришёл устраиваться в первый раз.
Здравствуйте, Андрей Хропов, Вы писали:
АХ>Здравствуйте, minorlogic, Вы писали:
M>>Понял , то есть вы хотите и дельше использовать объект в старом состоянии, если вы его не смогли изменить. Часто вам такая возможность нужна ?
АХ>Это что-то вроде мини-транзакционности (то есть либо Commit — объект в новом состоянии, либо Rollback — остался в старом). Для надежных систем может быть нужна. Слышал, что в том же Яндексе такое спрашивают.
Для надежных систем , я бы другие механизмы использовал.
Меня поражает другое, почему когда говорят об этом способе принимают само собой разумеещееся , что своп можно написать не кидающим исключение. Я в ветке все пытаюсь развить диалог до этой мысли , но не получается.
И второе , я реально не видел примеров использования этой технике. Обязательно бы посмотрел, но есть подозрение , что тоже самое можно сделать проще и красивше.
Здравствуйте, DKM_MSFT, Вы писали:
DKM>Единственное, что действительно важно — это системный подход и наличие нестандартного мышления. Если человек обладает системным подходом, он одинаково здорово справится с вопросом о тестировании функции сортировки, тестировании корпоративной сети и тестировании шариковой ручки. Если у человека присутствует нестандартность мышления, он предложит лучший и более красивый способ решения задачи, чем человек, мыслящий шаблонами.
Я бы сказал он предложит просто нестандартное решение, которое не обязательно проще или красивее. Но это так придирки.
А вообще согласен +1.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Здравствуйте, minorlogic, Вы писали:
M>И второе , я реально не видел примеров использования этой технике. Обязательно бы посмотрел, но есть подозрение , что тоже самое можно сделать проще и красивше.
boost::intrusive_ptr и другие смартпоитеры.
очень просто и удобно.
никакого ручного контроля за счетчиком, все делается в контструкторах и деструкторе.
Здравствуйте, Андрей Хропов, Вы писали:
K>>Работая на настоящей работе можно за 5 лет не написать ни одного конструктора копирования, АХ>+-1. Это все-таки довольно распространенная вещь. K>> ни одного const метода, АХ>-1. Это очень желательно применять как можно чаще.
При нынешнем уровне развития RAD средств, при наличии мощных библиотек программировать можно лишь создавая реализации уже описанных методов или функторов.
K>> не описать ни одного указателя на функцию, тем более метод класса. АХ>+1 K>> Но экзаменатор, если не всю муть, то уж добрую половину точно припомнит. АХ>Если экзаменатор вменяемый для него незнание синтаксиса указателей на метод класса не будет решающим аргументом.
Я считаю, что знание синтаксиса вообще является второстепенным. Выучить синтаксис любого языка программирования можно за несколько дней, если понимать концепции, которые этот синтаксис отражает. Но для экзаменатора вопросы по синтаксису — это самое очевидное, что он может предложить кандидату.
K>> Так что перед сменой работы Страуструпа читать от корки до корки однозначно. АХ>Или перейти на C#/Java .
Если человек чего-то не знает или не помнит, это не значит, что он не хочет или не может этого знать.
Здравствуйте, ggg, Вы писали:
K>>>А вообще, кто знает универсальную и абсолютно точную методологию выявляения класса (2), пусть первым кинет в меня камнем.
АХ>>Посмотреть резюме с указанием предыдущих мест работы ?
ggg>У меня стойкое ощущение, что Вы еще слишком молоды
А что по твоему опыту много людей с 0 опытом пишут что у них 5-летний стаж работы в Google и MS senior developerом?
Здравствуйте, Kemsky, Вы писали:
K>Я считаю, что знание синтаксиса вообще является второстепенным. Выучить синтаксис любого языка программирования можно за несколько дней, если понимать концепции, которые этот синтаксис отражает.
К сожалению, с C++ не все так просто.
Можно знать синтаксис, но не уметь им пользоваться для создания кода.
Можно уметь писать код, но не уметь его компилировать.
Так что, освоить плюсы за несколько дней — просто нереально. Хотя, как было замечено однажды, если речь идеть о полярных днях — то вполне возможно
И хотя с точки зрения пропаганды плюсов — это плохо, такой высокий барьер не так уж и плох для тех кто его преодалел
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, frik, Вы писали:
F>Здравствуйте, Hottabych1, Вы писали:
F>меня тоже частенько грузят ООП, хотя в резюме я нигде его не пишу. как я понял это как таблица умножения -все это должны знать? и это проще всего спросить? или ценность есть в знании ООП, даже если нигде его не применял? F>конечно если бы я каждый день его использовал, то может и помнил чтото, а так только из книжек без реальной практики
Меня тоже как то одни умники вначале математической задачкой мучили, которую я решил, затем спросили про принципы ООП, я четко сказать не смог что-то общее промямлил. Был еще вопросы но это уже не важно. Вобщем сейчас я вызубрил эти правила ООП, и что? Да ничего не изменилось, просто я вызубрил правила ООП. А пока большой кусок когда не зарефакторишь, пока сам фреймворк не напишешь, все равно не поймешь толком ООП.
Здравствуйте, Kemsky, Вы писали:
K>Здравствуйте, Hottabych1, Вы писали: ...
K>К собеседованию нужно готовиться, как к экзамену. Синтетические задачи и вопросы имеют свою спицифику. Работая на настоящей работе можно за 5 лет не написать ни одного конструктора копирования
Ну это может быть — это зависит от архитектуры и специфики, далеко не всегда надо копировать объекты.
K>ни одного const метода
Опускание const — это потенциальные грабли. Вот если я вызываю MyFunction(SomeVar) то мне очень бы хотелось быть уверенным, что SomeVar не будет изменена функцией (что касается поинтеров — тоже справедливо, хотя переменные передаваемые по поинтерам изменяются намного чаше). Это гарантируется наличием const в сигнатуре функции.
K>не описать ни одного указателя на функцию, тем более метод класса.
Вот указатель на мембер класса я по памяти не напишу, еще так хрень с точки зрения синтаксиса, на функцию думаю смогу припомнить, хотя тоже не без труда.
K> Но экзаменатор, если не всю муть, то уж добрую половину точно припомнит. Так что перед сменой работы Страуструпа читать от корки до корки однозначно.
Согласен, спрашивают коварные вопросы. Любого, даже очень опытного программера можно "подловить". я вот например очень удивился, когда 2-3 в резуьтате дало 4 миллиарда с копейками (один операнд был signed, другой unsigned)
Здравствуйте, Kemsky, Вы писали:
K>Здравствуйте, Hottabych1, Вы писали: ...
K>К собеседованию нужно готовиться, как к экзамену.
На собеседованиях надо быть естественным и не париться!
У несдачи экзамена могут быть последствия, у непрохождения собеседования последствий нет!
В любом случае после собеседования ты становишься умнее
Если не решил задачу, надо спросить о правильном решении, либо повторить проваленную теорию дома с книжками, потому что как показывает практика где то на 6-ом собеседовании новых вопросов по сравнению со старыми почти не появляется
Здравствуйте, DKM_MSFT, Вы писали:
DKM>Здравствуйте, egaron, Вы писали:
E>>Как сказал коллега — есть 2 типа программистов
DKM><skipped>
E>>Естественно, на теоретических собеседованиях вторая группа бракуется и идет в отстой.
DKM>Знаете, многие тут, конечно, со мной не согласятся, но я считаю то, что вы называете теоретическим собеседованием, глупостью. С моей точки зрения человек, который отлично знает синтаксис переопределения оператора присваивания, досконально вызубрил operator precedence and associativity (простите, забыл как это по-русски), или даже во сне может назвать тип 7го параметра функции CreateFile, с практической точки зрения отличается от человека, который всего этого не помнит, только одним. А именно тем, что он будет быстрее писать код. За счет меньшего количества обращений к документации. Не больше и не меньше этого.
DKM>То есть "теоретическое собеседование" с точки зрения практической полезности находится на том же уровне, что и тест на скорость печатания на клавиатуре.
DKM>Оно не является доказательством ни того, что человек понимает хоть одну из написанных им конструкций, ни того, что он ее хоть раз в жизни применял. В бытность мою студентом второго курса я ради смеха прошел несколько brainbench-like теоретических тестов по разным языкам, при этом мои знания по некоторым из них сводились к однократному чтению учебника за день до прохождения теста и выяснения наиболее стандартных вопросов подобных тестов в интернете. Вы удивитесь, если узнаете, насколько хорошо я их тогда прошел.
DKM>В полной мере вышесказанное относится также к TOEFL-like тестам по английскому, которые я после некоторой тренировки замечательно проходил, понимая не более 10% текста и даже не улавливая общий его смысл, тестам на определение iq, которые с 5го раза проходятся на уровне гения, разного рода сертификациям и другим вещам, где можно играть на типичности вопросов и некоторых других факторах, к предмету вообще не относящихся.
DKM>Единственное, что действительно важно — это системный подход и наличие нестандартного мышления. Если человек обладает системным подходом, он одинаково здорово справится с вопросом о тестировании функции сортировки, тестировании корпоративной сети и тестировании шариковой ручки. Если у человека присутствует нестандартность мышления, он предложит лучший и более красивый способ решения задачи, чем человек, мыслящий шаблонами.
DKM>Поэтому на собеседованиях нужно спрашивать не написание конструктора копирования или реализацию паттерна singleton. Задайте ему хорошую нетипичную задачу "на подумать", которая к ним сводится. Все и выясните. А может быть, узнаете, как ее можно решить гораздо проще и эффективнее. Это если вам повезет наткнуться на действительно классного программиста. И какая разница, если где-то он пропустил "&", не поставил ";" или перепутал порядок следования операторов? В работе его спасет IDE, MSDN и google. А вот думать они его научить не смогут.
Полностью поддерживаю... Я в прошлом году купил книжку по ADO.net, почитал ее неделю, затем пошел и сдал микрософтовский экзамен. Теперь я MCP. Правда, на следующей же неделе забыл все классы из ADO.Net.
Здравствуйте, captainPower, Вы писали:
P>Здравствуйте, Kemsky, Вы писали:
K>>Здравствуйте, Hottabych1, Вы писали: ...
K>>К собеседованию нужно готовиться, как к экзамену. P>На собеседованиях надо быть естественным и не париться! P>У несдачи экзамена могут быть последствия, у непрохождения собеседования последствий нет! P>В любом случае после собеседования ты становишься умнее P>Если не решил задачу, надо спросить о правильном решении, либо повторить проваленную теорию дома с книжками, потому что как показывает практика где то на 6-ом собеседовании новых вопросов по сравнению со старыми почти не появляется
Так, три собеседования у меня уже было, осталось еще три до счастья
Здравствуйте, ggg, Вы писали:
ggg>Здравствуйте, Hottabych1, Вы писали:
H>>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут . Как? Очень просто — нервы + забыл элементарную вещь. ggg>Не нужно нервничать перед собеседованием. Вы ж не студент перед экзаменом все-таки.
H>>Написал дрожащими руками вот такое: ggg>Да зачем дрожащие руки-то? Это что, первое собеседование в жизни, ведь нет же! Имхо, после 5 собеседований уже никогда не будешь волноваться и нервничать.
H>>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение? ggg>Лично мне не хотелось бы работать в команде с человеком, который ошибается в простых вещах. Даже если он мега-эксперт в каких-то там нестандартных задачах. Но это опять же верно не для всех команд/не для всех работодателей (а вдруг у кого выбора иного нет).
ggg>Не расстраивайтесь, полистайте Мейерса хотя бы (даже если в текущей работе вам все это не нужно). Эти книжки попроще, чем Страуструп. А то Страуструпа читают-то многие, да вот понимают/запоминают процентов 30. ggg>И помните, что неудачным собеседованием жизнь не заканчивается.
Спасибо за советы. Однако это было мое третье собеседование по специальности в жизни (если говорить именно о технической части собеседования) . И не каждый день твоей скромной персоной интересуется сам Яндекс. Накануне много думал о том, как хочется поработать в такой компании, как там интересно. Размышлял, как себя вести и т.д. Просто не мог отделаться от таких мыслей. Получилось напряжение и все пошло вообще не так, как хотелось бы.
Здравствуйте, DKM_MSFT, Вы писали:
DKM>Если у человека присутствует нестандартность мышления, он предложит лучший и более красивый способ решения задачи, чем человек, мыслящий шаблонами.
А можно мне поменьше этого "нестандартного" подхода? Грабли стандартных путей более менее известны, грабли нестандартных...
Здравствуйте, minorlogic, Вы писали:
M>Меня поражает другое, почему когда говорят об этом способе принимают само собой разумеещееся , что своп можно написать не кидающим исключение. Я в ветке все пытаюсь развить диалог до этой мысли , но не получается.
Можно. Всегда. Как минимум использование PIMPL
Здравствуйте, captainPower, Вы писали:
P>Меня тоже как то одни умники вначале математической задачкой мучили, которую я решил, затем спросили про принципы ООП, я четко сказать не смог что-то общее промямлил. Был еще вопросы но это уже не важно.
....
А зачем ты их так невежливо?
H>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
Такие люди как ты называются "велосипедисты". Почти везде у них необычные и нестандартдные решения стандартных задач. Лично я с такими не люблю работать. Если ты только окончил универ, то еще все впереди, а если ближе к 30, то ядреный велосипедист.
Здравствуйте, fGordon, Вы писали:
G>>> просто вот както в жизни <привык не доверять таким вот "по умолчанию" методам>. <привык описывать, если они нужны, "ручками">. КД>>Что-то я не понял зависимости между первым и вторым G>Что не понятного? Я опишу конструктор копии руками. Я не буду использовать конструктор копии "дефолтовый". G>Как еще объяснить, я не знаю...
А зачем?
class A
{
private:
int delta_;
int beta_;
std::string gamma_;
};
Пусть компьютер для него рисует оператор копирования и copy ctor, он железный, а мне за строчки не платят
Здравствуйте, Hottabych1, Вы писали:
H>Вообще, судя по количеству ответов тема довольна животрепещущая...
Неа, просто флейм и оффтоп поднялся. Одни copy ctor и operator= сколько постов собрали
Здравствуйте, Kubyshev Andrey, Вы писали:
H>>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
KA>Такие люди как ты называются "велосипедисты". Почти везде у них необычные и нестандартдные решения стандартных задач. Лично я с такими не люблю работать. Если ты только окончил универ, то еще все впереди, а если ближе к 30, то ядреный велосипедист.
Я на 6м курсе, в июне заканчиваю.
Здравствуйте, Kubyshev Andrey, Вы писали:
H>>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?
KA>Такие люди как ты называются "велосипедисты". Почти везде у них необычные и нестандартдные решения стандартных задач. Лично я с такими не люблю работать. Если ты только окончил универ, то еще все впереди, а если ближе к 30, то ядреный велосипедист.
А такие люди как ты называются "ходячие микросхемы". Стандартный набор состояний на входах — стандартный набор состояний на выходах.
Здравствуйте, LuciferMoscow, Вы писали:
S>>> надо ещё сделать проверку на присваивание самому себе: E>>Во-первых, эту проверку следует делать всегда, независимо от типа возвращаемого значения. LM>Тут уже показывали фокус со swap. И никаких проверок не нужно
Согласен, проверка в этом случае необязательна. Однако вреда от нее немного, а эффективность в некоторых (пускай и довольно редких) случаях может возрасти.
У того же Саттера:
Note that copy assignment operators may well elect to check for self-assignment even if they don't have to—for example, they might do so for efficiency.
Здравствуйте, enzo, Вы писали:
S>>>> надо ещё сделать проверку на присваивание самому себе: E>>>Во-первых, эту проверку следует делать всегда, независимо от типа возвращаемого значения. LM>>Тут уже показывали фокус со swap. И никаких проверок не нужно E>Согласен, проверка в этом случае необязательна. Однако вреда от нее немного, а эффективность в некоторых (пускай и довольно редких) случаях может возрасти.
ИМХО экономия на спичках.
Здравствуйте, branco, Вы писали:
KA>>Такие люди как ты называются "велосипедисты". Почти везде у них необычные и нестандартдные решения стандартных задач. Лично я с такими не люблю работать. Если ты только окончил универ, то еще все впереди, а если ближе к 30, то ядреный велосипедист. B>А такие люди как ты называются "ходячие микросхемы". Стандартный набор состояний на входах — стандартный набор состояний на выходах.
Хоть горшком назови, но если я приходу в фирму и мне говорят "мы используем буст", то это одно. А если я через пару месяцев нахожу в библиотеке класс Antocopyable, то это другое
Здравствуйте, LuciferMoscow, Вы писали:
LM>Извините, но "фокус со swap" позволят избежать дублирования кода(в copy ctor & operator=). Но не в Вашем случае
Фокус со swap позволяет не схватить исключение на полусозданном объекте и не потерять в памяти его члены.
Здравствуйте, Hottabych1, Вы писали:
H>Господа из Яндекса! H>Если вы это читаете, то дайте мне еще один шанс. Обещаю, возьмете к себе — не пожалеете!
Ты думаешь, если ты не помнишь семантику конструктора копирования и в корне не представляешь, что такое std::map, то ты будешь иметь какой-то успех в яндексе?
Здравствуйте, i-maverick, Вы писали:
LM>>Извините, но "фокус со swap" позволят избежать дублирования кода(в copy ctor & operator=). Но не в Вашем случае IM>Фокус со swap позволяет не схватить исключение на полусозданном объекте и не потерять в памяти его члены.
На полускопированном, если быть точным. Но в целом согласен.
АК>Вероятно, они имели в виду, что применение const — это признак хорошего качественного кода, в который изначально заложен дополнительный контроль и предотвращение возможных багов. Потому что const, по большому счету, в принципе необязателен... но зачем-то его придумали
А придумали const в операторе= и конструкторе копирования чтобы можно было копировать константные объекты.
Здравствуйте, AntZ, Вы писали:
AZ>Согласен, спрашивают коварные вопросы. Любого, даже очень опытного программера можно "подловить". я вот например очень удивился, когда 2-3 в резуьтате дало 4 миллиарда с копейками (один операнд был signed, другой unsigned)
33-битовый процессор? Тоже такой хочу!
Здравствуйте, fGordon, Вы писали:
G>ЗЫ: конечно, порой выводит из себя, что собеседуют по таким вещам, которые применяешь, но теорию по ним рассказать толком не можешь только на пальцах.. но сие похоже только моя проблема.
Кто ясно мыслит, тот ясно излагает! (копирайт не знаю чей )
Здравствуйте, sraider, Вы писали:
АК>>Вероятно, они имели в виду, что применение const — это признак хорошего качественного кода, в который изначально заложен дополнительный контроль и предотвращение возможных багов. Потому что const, по большому счету, в принципе необязателен... но зачем-то его придумали
S>А придумали const в операторе= и конструкторе копирования чтобы можно было копировать константные объекты.
S>
S>A a;
S>const A b;
S>// вот для этого:
S>a = b;
S>A c(b);
S>
Хм... а разве неконстантный объект к константному не приводится автоматом при передаче в качестве параметра?
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, fGordon, Вы писали:
G>>>> просто вот както в жизни <привык не доверять таким вот "по умолчанию" методам>. <привык описывать, если они нужны, "ручками">. КД>>>Что-то я не понял зависимости между первым и вторым G>>Что не понятного? Я опишу конструктор копии руками. Я не буду использовать конструктор копии "дефолтовый". G>>Как еще объяснить, я не знаю... LM>А зачем? LM>
LM>class A
LM>{
LM>private:
LM> int delta_;
LM> int beta_;
LM> std::string gamma_;
LM>};
LM>
LM>Пусть компьютер для него рисует оператор копирования и copy ctor, он железный, а мне за строчки не платят
Не понял... это шутка такая? Или серьезно? Если серьезно, то как по дефолту будет создана копия мембера gamma_, и как это отразится на надежности кода?
Здравствуйте, branco, Вы писали:
B>Здравствуйте, Hottabych1, Вы писали:
H>>Господа из Яндекса! H>>Если вы это читаете, то дайте мне еще один шанс. Обещаю, возьмете к себе — не пожалеете!
B>Можешь вот здесь http://www.isd.dp.ua/test.html.ru ещё потренироваться.
Интересно, у кого какие результаты Меня поблагодарили за участие
Здравствуйте, McSeem2, Вы писали:
MS>Здравствуйте, jazzer, Вы писали:
J>>Конструктор копирования — это конструктор с одним параметром-ссылкой на тот же самый класс. J>>Константная это ссылка или нет — не важно.
MS>Более того, передача по значению в конструкторе — это по сингнатуре тоже конструктор копирования! Просто так уж получилось в результате всех этих извилистых путей дизайна языка, что он приводит к бесконечной рекурсии. Типичный случай наступания себе на хвост.
Здравствуйте, dr.Chaos, Вы писали:
DC>То что этот конструктор может быть вызывается неявно в некоторых случаях и если объект содержит указатель, то при удалении копии нас ждет сюрприз. Мало того, если я пользуюсь чужим кодом, то я предполагаю не нарвусь на растяжку.
так. снова в меня летят непонятные камни
в итоге, в коде может быть:
а) КК дефолтовый, в создании которого я не принимал участия
б) КК "рукописный", делающий помимо основной работы еще какую то (какие нибудь индексы проапдейтил или еще что).
в) КК дефолтовый и КК "рукописный".
так вот, что может ввести вас в ступор при любом из этих исходов?
DC>Т.е. либо есть возможность копировать и она работает, либо копировать нельзя. Промежуточные состояния приводят к трате чужих нервов(своих?), особенно если глюк не проявился в отладке, но релиз убил.
Здравствуйте, LuciferMoscow, Вы писали:
LM>А зачем? LM>
LM>class A
LM>{
LM>private:
LM> int delta_;
LM> int beta_;
LM> std::string gamma_;
LM>};
LM>
LM>Пусть компьютер для него рисует оператор копирования и copy ctor, он железный, а мне за строчки не платят
бесспорно. но просто случаются такие моменты, когда нужен КК. и именно в такие моменты я описываю свой КК, а не надеюсь на работу дефолтового КК. и про такие моменты я и говорю.
Здравствуйте, Александр Каширин, Вы писали:
B>>Можешь вот здесь http://www.isd.dp.ua/test.html.ru ещё потренироваться.
АК>Интересно, у кого какие результаты Меня поблагодарили за участие
Как бы сложно сравнивать — у них всего два ответа — больше 85 и менее 85.
У меня получилось больше
Здравствуйте, Александр Каширин, Вы писали:
S>>А придумали const в операторе= и конструкторе копирования чтобы можно было копировать константные объекты.
<пример поскипан>
АК>Хм... а разве неконстантный объект к константному не приводится автоматом при передаче в качестве параметра?
Приводится. А вот константный к неконстантному — нет. Вот, на мой взгляд более понятный пример.
class A
{
...
A(const A&);
};
class B
{
...
B(B&);
}:
const A a = ...;
const B b = ...;
A acopy(a); // ok
B bcopy(b); // ошибка
Вообще с констами так: или все в проекте обязательно ими пользуются, или никто. Иначе, у тех, кто пользуется, возникнут проблемы с компиляцией. Возможно, товарищи в Яндексе хотят, чтобы в их проектах консты были, поэтому топикстартеру в приеме на работу отказали.
Здравствуйте, branco, Вы писали:
B>Здравствуйте, Александр Каширин, Вы писали:
B>>>Можешь вот здесь http://www.isd.dp.ua/test.html.ru ещё потренироваться.
АК>>Интересно, у кого какие результаты Меня поблагодарили за участие
B>Я набрал > 85 со второго раза.
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, Hottabych1, Вы писали:
H>>Господа из Яндекса! H>>Если вы это читаете, то дайте мне еще один шанс. Обещаю, возьмете к себе — не пожалеете!
IM>Ты думаешь, если ты не помнишь семантику конструктора копирования и в корне не представляешь, что такое std::map, то ты будешь иметь какой-то успех в яндексе?
Где это я его не представляю?
Подумаешь, сортированный или нет — стандарт это, кстати, не определяет.
Здравствуйте, Hottabych1, Вы писали:
H>>>Господа из Яндекса! H>>>Если вы это читаете, то дайте мне еще один шанс. Обещаю, возьмете к себе — не пожалеете!
IM>>Ты думаешь, если ты не помнишь семантику конструктора копирования и в корне не представляешь, что такое std::map, то ты будешь иметь какой-то успех в яндексе?
H>Где это я его не представляю?
Здравствуйте, fGordon, Вы писали:
G>Здравствуйте, dr.Chaos, Вы писали:
DC>>То что этот конструктор может быть вызывается неявно в некоторых случаях и если объект содержит указатель, то при удалении копии нас ждет сюрприз. Мало того, если я пользуюсь чужим кодом, то я предполагаю не нарвусь на растяжку.
G>так. снова в меня летят непонятные камни
А Вы, сударь, понятнее выражайтесь .
G>в итоге, в коде может быть: G>а) КК дефолтовый, в создании которого я не принимал участия G>б) КК "рукописный", делающий помимо основной работы еще какую то (какие нибудь индексы проапдейтил или еще что). G>в) КК дефолтовый и КК "рукописный".
Это как?
G>так вот, что может ввести вас в ступор при любом из этих исходов?
Если КК будет работать неверно . В предыдущем посте есть фраза:
По мере написания программы, мне захотелось использовать конструктор копии (КК) для этого класса. Я пишу его "в ручную"
Из него следует вывод если ты не задумался о копировании, то КК дефолтовый, причем непонятно корректно работающий или нет. Т.е. если ты его не используешь лучше сделать его приватным и пустым, у пользователя твоего кода не будет проблем со странным поведением при копировании.
DC>>Т.е. либо есть возможность копировать и она работает, либо копировать нельзя. Промежуточные состояния приводят к трате чужих нервов(своих?), особенно если глюк не проявился в отладке, но релиз убил.
G>КК _так_и_так_ будет.
Конечно будет, только при его использовании будет ошибка компилятора.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Здравствуйте, Александр Каширин, Вы писали:
АК>Здравствуйте, LuciferMoscow, Вы писали:
LM>>Здравствуйте, fGordon, Вы писали:
G>>>>> просто вот както в жизни <привык не доверять таким вот "по умолчанию" методам>. <привык описывать, если они нужны, "ручками">. КД>>>>Что-то я не понял зависимости между первым и вторым G>>>Что не понятного? Я опишу конструктор копии руками. Я не буду использовать конструктор копии "дефолтовый". G>>>Как еще объяснить, я не знаю... LM>>А зачем? LM>>
LM>>class A
LM>>{
LM>>private:
LM>> int delta_;
LM>> int beta_;
LM>> std::string gamma_;
LM>>};
LM>>
LM>>Пусть компьютер для него рисует оператор копирования и copy ctor, он железный, а мне за строчки не платят
АК>Не понял... это шутка такая? Или серьезно? Если серьезно, то как по дефолту будет создана копия мембера gamma_, и как это отразится на надежности кода?
Кхм.. слушайте может всё таки сначала учим матчасть а потом вступаем в дисскуссию?
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, Hottabych1, Вы писали:
H>>>>Господа из Яндекса! H>>>>Если вы это читаете, то дайте мне еще один шанс. Обещаю, возьмете к себе — не пожалеете!
IM>>>Ты думаешь, если ты не помнишь семантику конструктора копирования и в корне не представляешь, что такое std::map, то ты будешь иметь какой-то успех в яндексе?
H>>Где это я его не представляю?
IM>вот здесь
H>>Подумаешь, сортированный или нет — стандарт это, кстати, не определяет.
IM>А читать пробовал? 23.1.2-2
Не понимаю... разве это не дерево? Только с сортировкой обшибся .
Здравствуйте, Hottabych1, Вы писали:
H>Здравствуйте, i-maverick, Вы писали:
IM>>Здравствуйте, Hottabych1, Вы писали:
H>>>Господа из Яндекса! H>>>Если вы это читаете, то дайте мне еще один шанс. Обещаю, возьмете к себе — не пожалеете!
IM>>Ты думаешь, если ты не помнишь семантику конструктора копирования и в корне не представляешь, что такое std::map, то ты будешь иметь какой-то успех в яндексе? H>Где это я его не представляю? H>Подумаешь, сортированный или нет — стандарт это, кстати, не определяет.
крик души:
Ну вы просто ГОНИТЕ!!!, я имею ввиду не тебя одного...
Как не заня самых основ можно гнуть пальцы и кричать какой я крутой програмар, как я прикольно и нестандартно решаю задачи, и как я быстро нахожу в книжках "незначительные детали". Читаю эту ветку и просто оxyzеваю. Я понимаю что можно чего-то не знать, я понимаю что можно не занать вообще ничего, но что заставляет вас при этом учить тех кто знает?
В студенческие годы у меня тоже были провальные интервью, из них я делал простой вывод — надо учится. Почемы Вы делаете вывод что компания которая не хочет вас брать на роботу, гонит и понтуется, неужели может быть настолько неадекватная самооценка?
Яндексу +1 раз он так быстро тебя забраковал. Я видел компании где за неимением лучьших брали и таких, но это совсем не "солидные компании"
Здравствуйте, fGordon, Вы писали:
LM>>Пусть компьютер для него рисует оператор копирования и copy ctor, он железный, а мне за строчки не платят G>бесспорно. но просто случаются такие моменты, когда нужен КК. и именно в такие моменты я описываю свой КК, а не надеюсь на работу дефолтового КК. и про такие моменты я и говорю.
А зачем руками рисовать для описаного класса copy ctor?
Здравствуйте, Александр Каширин, Вы писали:
LM>>Пусть компьютер для него рисует оператор копирования и copy ctor, он железный, а мне за строчки не платят АК>Не понял... это шутка такая? Или серьезно? Если серьезно, то как по дефолту будет создана копия мембера gamma_(std::string — примечание LM), и как это отразится на надежности кода?
Вы шутите или издеваетесь?
Здравствуйте, Александр Каширин, Вы писали:
АК>Здравствуйте, LuciferMoscow, Вы писали:
LM>>Здравствуйте, fGordon, Вы писали:
G>>>>> просто вот както в жизни <привык не доверять таким вот "по умолчанию" методам>. <привык описывать, если они нужны, "ручками">. КД>>>>Что-то я не понял зависимости между первым и вторым G>>>Что не понятного? Я опишу конструктор копии руками. Я не буду использовать конструктор копии "дефолтовый". G>>>Как еще объяснить, я не знаю... LM>>А зачем? LM>>
LM>>class A
LM>>{
LM>>private:
LM>> int delta_;
LM>> int beta_;
LM>> std::string gamma_;
LM>>};
LM>>
LM>>Пусть компьютер для него рисует оператор копирования и copy ctor, он железный, а мне за строчки не платят
АК>Не понял... это шутка такая? Или серьезно? Если серьезно, то как по дефолту будет создана копия мембера gamma_, и как это отразится на надежности кода?
Здравствуйте, superman, Вы писали:
S>Здравствуйте, Hottabych1, Вы писали:
H>>Здравствуйте, i-maverick, Вы писали:
IM>>>Здравствуйте, Hottabych1, Вы писали:
H>>>>Господа из Яндекса! H>>>>Если вы это читаете, то дайте мне еще один шанс. Обещаю, возьмете к себе — не пожалеете!
IM>>>Ты думаешь, если ты не помнишь семантику конструктора копирования и в корне не представляешь, что такое std::map, то ты будешь иметь какой-то успех в яндексе? H>>Где это я его не представляю? H>>Подумаешь, сортированный или нет — стандарт это, кстати, не определяет.
S>крик души:
S>Ну вы просто ГОНИТЕ!!!, я имею ввиду не тебя одного... S>Как не заня самых основ можно гнуть пальцы и кричать какой я крутой програмар, как я прикольно и нестандартно решаю задачи, и как я быстро нахожу в книжках "незначительные детали". Читаю эту ветку и просто оxyzеваю. Я понимаю что можно чего-то не знать, я понимаю что можно не занать вообще ничего, но что заставляет вас при этом учить тех кто знает?
S>В студенческие годы у меня тоже были провальные интервью, из них я делал простой вывод — надо учится. Почемы Вы делаете вывод что компания которая не хочет вас брать на роботу, гонит и понтуется, неужели может быть настолько неадекватная самооценка?
S>Яндексу +1 раз он так быстро тебя забраковал. Я видел компании где за неимением лучьших брали и таких, но это совсем не "солидные компании"
Напротив, очень зря меня Яндекс не взял . Да, многого не знаю, но главное, что голова есть на плечах и в сильной команде я, уверен, быстро дорасту до соответствующего уровня. А если не давать никому шанс, то скоро просто неоткуда будет брать хороших специалистов. Так как, чтобы стать таким надо пройти определенную школу, работая с сильными коллегами. А потом самому привлекать новичков, передавая им знания.
S>>Яндексу +1 раз он так быстро тебя забраковал. Я видел компании где за неимением лучьших брали и таких, но это совсем не "солидные компании" H>Напротив, очень зря меня Яндекс не взял . Да, многого не знаю, но главное, что голова есть на плечах
Видимо либо для них это не главное, Либо им этого одного не достаточно, они видать ещё желают что бы эта голова на плячах не только была, а ещё и думать умела
а если серьёзно им может быть совсем не очевидно что эта самая говлова на плечах у вас есть, зато очевидна недостаточная подготовка.
раз уж вы так гордитесь своей головой-на-плечах постарайтесь обосновать полезность и принцыпы построенения такой структуры как несортированное (в общем случае неупорядоченное) дерево
H>и в сильной команде я, уверен, быстро дорасту до соответствующего уровня.
В сильной конторе существует определённый стартовый ценз, настолько сильный стартовый ценз насколько это может себе позволить контора. Яндекс может себе позволить толковый стартовый ценз. ИМХО вам стоит ещё подучиться а не метить в сильную контору или коллектив гуру — вы там будете пятым колесом. Это не значит что вы не найдёте подходящей вам роботы, это значит что притензии на сильный коллектив типа Яндекса сейчас явно безпочвенны
H> А если не давать никому шанс, то скоро просто неоткуда будет брать хороших специалистов.
+1 их и так не так егко брать, только вот врятли целью Яндекса является давать шанс. Видимо ему ещё есть где их брать, за что ему большущий респект.
H>Так как, чтобы стать таким надо пройти определенную школу, работая с сильными коллегами. А потом самому привлекать новичков, передавая им знания.
а вы сможете работать с сильными колегами? Уж конечно имея толкового наставника всё даётся легче, только с чего вы взяли что вы нужны и полезны данному конкретному потенциальному наставнику?
Здравствуйте, Hottabych1, Вы писали:
S>>Яндексу +1 раз он так быстро тебя забраковал. Я видел компании где за неимением лучьших брали и таких, но это совсем не "солидные компании" H>Напротив, очень зря меня Яндекс не взял . Да, многого не знаю, но главное, что голова есть на плечах и в сильной команде я, уверен, быстро дорасту до соответствующего уровня. А если не давать никому шанс, то скоро просто неоткуда будет брать хороших специалистов. Так как, чтобы стать таким надо пройти определенную школу, работая с сильными коллегами. А потом самому привлекать новичков, передавая им знания.
ну а вообще оптимистичный настрой и уверенность в себе это конечно плюс, вот только при этом стоит быть хоть чуть-чуть реалистичным.
Здравствуйте, superman, Вы писали:
S>Здравствуйте, branco, Вы писали:
B>>Здравствуйте, Александр Каширин, Вы писали:
B>>>>Можешь вот здесь http://www.isd.dp.ua/test.html.ru ещё потренироваться.
S>забавно, я даже собеседовался в эту контору
S>ИМХО тест туповатый, хоть я его и прошел
В этой конторе текучка. Объявления о вакансиях висят постоянно.
Здравствуйте, Hottabych1, Вы писали:
<skipped>(разговор про map) H>>>Подумаешь, сортированный или нет — стандарт это, кстати, не определяет. IM>>А читать пробовал? 23.1.2-2 H>Не понимаю... разве это не дерево? Только с сортировкой обшибся .
Читай книгу Джосьютиса про STL
Здравствуйте, Hottabych1, Вы писали:
H>Напротив, очень зря меня Яндекс не взял . Да, многого не знаю, но главное, что голова есть на плечах и в сильной команде я, уверен, быстро дорасту до соответствующего уровня.
Трудно стать писателем не зная букв
H>А если не давать никому шанс, то скоро просто неоткуда будет брать хороших специалистов. Так как, чтобы стать таким надо пройти определенную школу, работая с сильными коллегами. А потом самому привлекать новичков, передавая им знания.
Некоторые знания ты должен получить САМ
H>Просто не мог отделаться от таких мыслей. Получилось напряжение и все пошло вообще не так, как хотелось бы.
Вы не понимаете... ИМХО проблема не в том что вы нервничали, проблема в том что вы им в принципе не подошли, вам знаний просто не хватило. Синтаксис конструктора копирования это не какая-то там деталь которую можно где-то подсмотреть, то что вы написали не от нервов а от недостаточного уровня знаний! Если бы вы не нервничали — вы бы засыпались не на 15 а скажем на 21-ой минуте (на несортированности элементов в мапепе к примеру )
Это не тест — там нет ответов. Просто список заданий.
А вообще, что ты уже второй раз кидаешь ссылку и тихо улыбаешься? Инициатива наказуема: присылай свое решение.
Здравствуйте, superman, Вы писали:
S>Здравствуйте, Hottabych1, Вы писали:
H>>Просто не мог отделаться от таких мыслей. Получилось напряжение и все пошло вообще не так, как хотелось бы.
S>Вы не понимаете... ИМХО проблема не в том что вы нервничали, проблема в том что вы им в принципе не подошли, вам знаний просто не хватило. Синтаксис конструктора копирования это не какая-то там деталь которую можно где-то подсмотреть, то что вы написали не от нервов а от недостаточного уровня знаний! Если бы вы не нервничали — вы бы засыпались не на 15 а скажем на 21-ой минуте (на несортированности элементов в мапепе к примеру )
Да, думаю, да. Вы правы.
Здравствуйте, branco, Вы писали:
B>Здравствуйте, superman, Вы писали:
S>>Здравствуйте, branco, Вы писали:
B>>>Здравствуйте, Александр Каширин, Вы писали:
B>>>>>Можешь вот здесь http://www.isd.dp.ua/test.html.ru ещё потренироваться.
S>>забавно, я даже собеседовался в эту контору
S>>ИМХО тест туповатый, хоть я его и прошел
B>В этой конторе текучка. Объявления о вакансиях висят постоянно.
B>А как насчёт вот этого теста? Он как раз на вакансию в Яндексе. B>http://company.yandex.ru/inside/job/music_developer.xml
Я его проходил и после этого меня приглачили в Яндекс беседовать.
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, Hottabych1, Вы писали:
B>>>http://company.yandex.ru/inside/job/music_developer.xml H>>Я его проходил и после этого меня приглачили в Яндекс беседовать.
IM>А ты можешь кинуть свои ответы сюда? Очень интересно посмотреть.
Могу . Хехе, сейчас Яндексу придется срочно менять тесты .
Но я над ними долго и внимательно корпел, с компилятором и документацией, а также книжкой Кернигана.
Вот, к примеру, мой ответ на второй вопрос (там, где галочки проставлять):
1) Несортированый vector позволяет найти требуемый элемент только последовательным перебором. Т.е. при увеличении количества обрабатываемых данных на одну единицу количество шагов также увеличится на один. Это линейная зависимость O(n).
2) Сортированный vector позволяет, при использовании бинарного поиска, на каждом шаге отсеивать половину элементов, т.е. его сложность будет O(log2(n)) -- логарифм по снованию 2 от n (а не O(ln(n))).
3) Список обладает не очень хорошими характеристиками для поиска, т.к. нам требуется последовательно проходить по цепочке для доступа к нужному элементу (O(n)). Это касается как сортированного, так и несортированного списка.
4) Дек строится на базе динамического массива и, следовательно, поиск в нем будет обладать такой же сложностью, как и в классе vector.
5) Множества (set и multiset) представляют собой дерево и, благодаря этому, сортированные множества могут допускать бинарный поиск, отсекающий сразу половину элементов. Т.е. обладают сложностью поиска O(log2(n)). Это не касается несортированных множеств.
6) Для hash_set многое зависит от реализации хеш-функции. При ее хорошей реализации время поиска элемента по значению может даже составлять O(1), т.е. константу!!
Здравствуйте, Hottabych1, Вы писали:
IM>>А ты можешь кинуть свои ответы сюда? Очень интересно посмотреть. H>Могу . Хехе, сейчас Яндексу придется срочно менять тесты . H>Но я над ними долго и внимательно корпел, с компилятором и документацией, а также книжкой Кернигана.
И чего Вы хотели? Вы обманули Яндекс на первом этапе. На втором Вас порезали
Здравствуйте, Hottabych1, Вы писали:
IM>>А ты можешь кинуть свои ответы сюда? Очень интересно посмотреть. H>Могу . Хехе, сейчас Яндексу придется срочно менять тесты .
Ну конечно. Они там уже несколько лет висят, и никто не может их решить. И вот пришел ты — народный герой! Спасибо тебе, что раскрыл завесу тьмы для всего общества.
Здравствуйте, superman, Вы писали:
S>вещью, сделанной таким образом что бы ей легко мог воспользоваться даже самый глупый человек, будет легче и приятней пользоваться и самому умному.
"Создайте систему, которой сможет пользоваться каждый дурак, и только дурак захочет ей пользоваться". (с) Закон Мерфи.
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, branco, Вы писали:
B>>А как насчёт вот этого теста? Он как раз на вакансию в Яндексе. B>>http://company.yandex.ru/inside/job/music_developer.xml LM>А результаты можно узнать только у Яндекса
LM>P.S. Вы второй раз за день эту ссылку даете. свою компанию пиарите?
Нет. Я на этот тест сегодня случайно наткнулся.
Думал, ссылку не заметил никто.
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, Hottabych1, Вы писали:
IM>>>А ты можешь кинуть свои ответы сюда? Очень интересно посмотреть. H>>Могу . Хехе, сейчас Яндексу придется срочно менять тесты . H>>Но я над ними долго и внимательно корпел, с компилятором и документацией, а также книжкой Кернигана. LM>И чего Вы хотели? Вы обманули Яндекс на первом этапе. На втором Вас порезали
Какая разница, как я получил верный результат? Почему бы на собеседовании не давать воспользоваться интернетом и компилятором?
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, Hottabych1, Вы писали:
H>>Вот, к примеру, мой ответ на второй вопрос (там, где галочки проставлять):
IM>Второй — это неинтересно. Это легко можно в книжке найти. Ты напиши на 1-ый и 5-ый. Вот и посмотрим.
На первый (про класс Foo):
1) В объявлении класса Bar не указан статус внешней видимости членов базового класса (class Bar: Foo). По умолчанию он будет принят равным private, из-за этого не получится создать объект b в функции main (т.к. он приводится к типу Foo, а это приведение недоступно). Таким образом, получим ошибку компилятора в строке Foo* b = new Bar(200);
2)В классе Bar конструктор не вызывает явно конструктор базового класса. В этом случае происходит вызов конструктора по умолчанию, однако в классе Foo уже определен пользовательский конструктор с параметром, который должен вызываться классом-наследником. Поэтому получим ошибку компилятора (отсутствует подходящий конструктор по умолчанию базового класса). Итак, есть два варианта решения проблемы: либо добавить в базовый класс конструктор без параметров, либо в конструкторе производного класса осуществлять вызов конструктора базового ( Bar(int j): Foo(j) {i=new char[j]; })
3)При присвоении (*f=*b) вызовется конструктор копирования, который в перменную i класса Foo запишет значение переменной i из класса Bar. Эта переменная является указателем на выделенную область памяти. При удалении переменной f деструктор класса Foo освободит память по адресу, находящемуся в переменной i. В итоге, при удалении переменной b деструктор попытается освободить уже освобожденную память (поскольку i из класса Foo и i из класса Bar содержат один и тот же адрес).
Здравствуйте, Hottabych1, Вы писали:
LM>>И чего Вы хотели? Вы обманули Яндекс на первом этапе. На втором Вас порезали H>Какая разница, как я получил верный результат? Почему бы на собеседовании не давать воспользоваться интернетом и компилятором?
Потому, что некоторые вещи нужно помнить. Если ты этого не помнишь, то ты нам не нужен
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, Hottabych1, Вы писали:
LM>>>И чего Вы хотели? Вы обманули Яндекс на первом этапе. На втором Вас порезали H>>Какая разница, как я получил верный результат? Почему бы на собеседовании не давать воспользоваться интернетом и компилятором? LM>Потому, что некоторые вещи нужно помнить. Если ты этого не помнишь, то ты нам не нужен
Хорошо, теперь я это помню. Возьмете?
Здравствуйте, Hottabych1, Вы писали:
H>На первый (про класс Foo):
Эх... Еще бы ты мог объяснить то, что процитировал.
И ты не увидел самых простых и очевидных ошибок:
1. Деструктор невиртуальный -> утечка;
2. Некорректное удаление массивов -> неопределенное поведение;
3. Ф-ия main — void -> несоответствие стандарту.
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, Hottabych1, Вы писали:
H>>На первый (про класс Foo):
IM>Эх... Еще бы ты мог объяснить то, что процитировал.
IM>И ты не увидел самых простых и очевидных ошибок: IM>1. Деструктор невиртуальный -> утечка; IM>2. Некорректное удаление массивов -> неопределенное поведение; IM>3. Ф-ия main — void -> несоответствие стандарту.
Погоди... я тут процитировал только свои слова. То, что написано — это я сидел и решал, а потом себе записал в удобочитаемом виде, чтобы послать в Яндекс.
Здравствуйте, Hottabych1, Вы писали:
LM>>>>И чего Вы хотели? Вы обманули Яндекс на первом этапе. На втором Вас порезали H>>>Какая разница, как я получил верный результат? Почему бы на собеседовании не давать воспользоваться интернетом и компилятором? LM>>Потому, что некоторые вещи нужно помнить. Если ты этого не помнишь, то ты нам не нужен H>Хорошо, теперь я это помню. Возьмете?
Есть несколько проблем.
1. Это не болезнь. Это симптом.
2. Я не в Яндексе
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, branco, Вы писали:
B>>В этой конторе текучка. Объявления о вакансиях висят постоянно.
IM>На Яндексе тоже постоянно висят. Это ни о чем не говорит.
B>>А как насчёт вот этого теста? Он как раз на вакансию в Яндексе. B>>http://company.yandex.ru/inside/job/music_developer.xml
IM>Это не тест — там нет ответов. Просто список заданий. IM>А вообще, что ты уже второй раз кидаешь ссылку и тихо улыбаешься? Инициатива наказуема: присылай свое решение.
Ну, 1-й вопрос,
На вскидку, не заглядывая в стандарт,доки и.т.д.
Здравствуйте, AndrewJD, Вы писали:
H>>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? AJD>Может солидной фирме нужен был специалист по с++ и у нех небыло свободной джунировской позиции.
Значит судя по timeframe этого сообщения, тем кто выгнал человека с собеседования был я.
Могу рассказать как все это выглядело с моей стороны. Возможно забыл детали — можешь поправить.
Человек пишет:
A::A(A a)
{
...
}
Я говорю это не работает — приводит к бесконечной рекурсии. В ответ непонимание.
Спрашиваю наводящий вопрос: если мы передаем класс в функцию по значению, как он туда копируется?
Ответ: конструктором копирования.
Вопрос: а здесь каким конструктором копирования?
В ответ понимающий взгляд, и ответ "ну конечно должно быть так".
A::A(A* a)
{
...
}
Я по-моему задал какой-то еще наводящий вопрос. Какой не помню — помоему спросил почему std::string копируется в синтаксисе
string s(other_string);
Получил опять понимающий взгляд: "ну конечно же!"
A::A(A& a)
{
...
}
Здесь я сказал уже лучше, но все равно чего-то не хватает. И в качестве примера попытался привести следующий код, который не сработает.
const A a;
A a1(a);
Будет ошибка компиляции.
Внимание jazzer-у, стандартов мы не обсуждали, был конкретный класс с написанными членами, и конкретная ситуация в которой конструктор не работал, т.к. не компилился
В ответ полное непонимание. Примерно 2-3 минуты я пытался придумать наводящий вопрос, все мои попытки не увенчались успехов. В результате я пришел к выводу что концепция константных объектов человеку полностью чужда. В этом момент я окончательно принял решение, что я не хочу с этим человеком работать в команде. В тот момент когда я это понимаю я об этом говорю сразу — отказывать людям в глаза меня не напрягает, и лишнего времени на то, чтобы задать человеку еще несколько на порядок более сложных вопросов и убедиться, что он на них тоже не ответит у меня нет.
Плюс я считаю этот метод более честным, чем для вида еще 2 часа мучать человека, чтобы потом ему сказать "ну ок — мы подумаем и напишем наше решение".
Тем не менее из всей этой ситуации сделаны очень неправильные выводы. Разъясню свою точку зрения популярно:
Человек был выгнан не за незнание синтаксиса. Мне вообще глубоко наплевать на знание синтаксиса. Вообще говоря у нас в Яндексе принято, что во время прохождения собеседования можно пользоваться Яндексом и Гуглем(забыл что-то, спроси у человека который тебя собеседует — он ответит). Просто об этом говорят в момент когда переходят от совсем базовых задач к сложным, где хотя бы упоминаются функции у которых имеет смысл узнавать параметры.
Я увидел, что человек ни разу в жизни не написал класс который можно корректно положить в STL-евский контейнер(попытка написать A*) и не понимает, что такое константность объектов(A&). Плюс с очевидных подсказок не может придумать это прямо во время собеседования(я взял на работу пару студентов, которые не знали, но делали несколько логичных предположений на собеседовании и в результате решали задачу — здесь этого не произошло).
Работать с таким человеком я не захотел. Может быть я злой и циничный человек.
P.S. Для информации — задача здесь была вообще не на конструктор копирования — просто я не успел ее задать.
P.P.S. В процессе я по-моему поправил несколько мелких ошибок синтаксиса типа нерасставленных * в теле конструктора, про них не упоминаю т.к. действительно не важно.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте, Hottabych1, Вы писали:
H>Господа из Яндекса! H>Если вы это читаете, то дайте мне еще один шанс. Обещаю, возьмете к себе — не пожалеете!
Я же тебе сказал — приходи через пол года если почувствуешь, что стал круче.
P.S. На 21 минуте точно бы засыпался как говорят. Тебя про map не только бы спросили сортированный он или нет, но и почему он сортированный. И как внутри устроен.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Он кстати очень простой. Такой pre-screening ватоматический. Автор топика его прошел.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте, Anatolix, Вы писали:
B>>А как насчёт вот этого теста? Он как раз на вакансию в Яндексе. B>>http://company.yandex.ru/inside/job/music_developer.xml A>Он кстати очень простой. Такой pre-screening ватоматический. Автор топика его прошел.
Ну судя по его ответам в этой ветке, не решил даже первую задачу.
Здравствуйте, i-maverick, Вы писали:
B>>>А как насчёт вот этого теста? Он как раз на вакансию в Яндексе. B>>>http://company.yandex.ru/inside/job/music_developer.xml A>>Он кстати очень простой. Такой pre-screening ватоматический. Автор топика его прошел.
IM>Ну судя по его ответам в этой ветке, не решил даже первую задачу.
Да брось ты. Этот тест писал я вместе с еще одним хорошим программистом.
В первом вопросы была цель сделать наибольшее количество ошибок в наименьшем куске кода.
Максимум помоему находили 13, совершенно не обязательно найти все для того, чтобы прийти
на собеседование. Вообще по-моему любого нормального человека заломает полчаса сидеть над
куском кода в 15 строчек. Если мы видим что человек понимает, про что это пусть приходит.
Это не тест на то брать/не брать, а на то звать/не звать. Иногда мы приглашаем человека
с явными ошибками, просто потому что в чем то нам его ответ понравился.
А вообще основную мысль которую хотелось донести тестом: вопросы простые, на собеседовании
будут сильно сложнее. Донести удалось не до всех. С другой стороны ничего страшного.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте, Anatolix, Вы писали:
A>Здравствуйте, AndrewJD, Вы писали:
H>>>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? AJD>>Может солидной фирме нужен был специалист по с++ и у нех небыло свободной джунировской позиции.
A>Значит судя по timeframe этого сообщения, тем кто выгнал человека с собеседования был я. A>Могу рассказать как все это выглядело с моей стороны. Возможно забыл детали — можешь поправить.
A>Человек пишет: A>
A>A::A(A a)
A>{
A>...
A>}
A>
A>Я говорю это не работает — приводит к бесконечной рекурсии. В ответ непонимание.
A>Спрашиваю наводящий вопрос: если мы передаем класс в функцию по значению, как он туда копируется? A>Ответ: конструктором копирования. A>Вопрос: а здесь каким конструктором копирования? A>В ответ понимающий взгляд, и ответ "ну конечно должно быть так".
A>
A>A::A(A* a)
A>{
A>...
A>}
A>
A>Я по-моему задал какой-то еще наводящий вопрос. Какой не помню — помоему спросил почему std::string копируется в синтаксисе A>string s(other_string); A>Получил опять понимающий взгляд: "ну конечно же!"
A>
A>A::A(A& a)
A>{
A>...
A>}
A>
A>Здесь я сказал уже лучше, но все равно чего-то не хватает. И в качестве примера попытался привести следующий код, который не сработает.
A>
A>const A a;
A>A a1(a);
A>
A>Будет ошибка компиляции. A>
Внимание jazzer-у, стандартов мы не обсуждали, был конкретный класс с написанными членами, и конкретная ситуация в которой конструктор не работал, т.к. не компилился
A>В ответ полное непонимание. Примерно 2-3 минуты я пытался придумать наводящий вопрос, все мои попытки не увенчались успехов. В результате я пришел к выводу что концепция константных объектов человеку полностью чужда. В этом момент я окончательно принял решение, что я не хочу с этим человеком работать в команде. В тот момент когда я это понимаю я об этом говорю сразу — отказывать людям в глаза меня не напрягает, и лишнего времени на то, чтобы задать человеку еще несколько на порядок более сложных вопросов и убедиться, что он на них тоже не ответит у меня нет. A>Плюс я считаю этот метод более честным, чем для вида еще 2 часа мучать человека, чтобы потом ему сказать "ну ок — мы подумаем и напишем наше решение".
A>Тем не менее из всей этой ситуации сделаны очень неправильные выводы. A>Разъясню свою точку зрения популярно: A>Человек был выгнан не за незнание синтаксиса. Мне вообще глубоко наплевать на знание синтаксиса. Вообще говоря у нас в Яндексе принято, что во время прохождения собеседования можно пользоваться Яндексом и Гуглем(забыл что-то, спроси у человека который тебя собеседует — он ответит). Просто об этом говорят в момент когда переходят от совсем базовых задач к сложным, где хотя бы упоминаются функции у которых имеет смысл узнавать параметры.
A>Я увидел, что человек ни разу в жизни не написал класс который можно корректно положить в STL-евский контейнер(попытка написать A*) и не понимает, что такое константность объектов(A&). Плюс с очевидных подсказок не может придумать это прямо во время собеседования(я взял на работу пару студентов, которые не знали, но делали несколько логичных предположений на собеседовании и в результате решали задачу — здесь этого не произошло).
A>Работать с таким человеком я не захотел. Может быть я злой и циничный человек.
A>P.S. Для информации — задача здесь была вообще не на конструктор копирования — просто я не успел ее задать.
A>P.P.S. В процессе я по-моему поправил несколько мелких ошибок синтаксиса типа нерасставленных * в теле конструктора, про них не упоминаю т.к. действительно не важно.
Да, всё так и было... не знаю, почему так получилось. Я правда очень волновался...
Здравствуйте, Anatolix, Вы писали:
A>Здравствуйте, AndrewJD, Вы писали:
H>>>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? AJD>>Может солидной фирме нужен был специалист по с++ и у нех небыло свободной джунировской позиции.
A>Значит судя по timeframe этого сообщения, тем кто выгнал человека с собеседования был я. A>Могу рассказать как все это выглядело с моей стороны. Возможно забыл детали — можешь поправить.
A>Человек пишет: A>
A>A::A(A a)
A>{
A>...
A>}
A>
A>Я говорю это не работает — приводит к бесконечной рекурсии. В ответ непонимание.
A>Спрашиваю наводящий вопрос: если мы передаем класс в функцию по значению, как он туда копируется? A>Ответ: конструктором копирования. A>Вопрос: а здесь каким конструктором копирования? A>В ответ понимающий взгляд, и ответ "ну конечно должно быть так".
A>
A>A::A(A* a)
A>{
A>...
A>}
A>
A>Я по-моему задал какой-то еще наводящий вопрос. Какой не помню — помоему спросил почему std::string копируется в синтаксисе A>string s(other_string); A>Получил опять понимающий взгляд: "ну конечно же!"
A>
A>A::A(A& a)
A>{
A>...
A>}
A>
A>Здесь я сказал уже лучше, но все равно чего-то не хватает. И в качестве примера попытался привести следующий код, который не сработает.
A>
A>const A a;
A>A a1(a);
A>
A>Будет ошибка компиляции. A>
Внимание jazzer-у, стандартов мы не обсуждали, был конкретный класс с написанными членами, и конкретная ситуация в которой конструктор не работал, т.к. не компилился
A>В ответ полное непонимание. Примерно 2-3 минуты я пытался придумать наводящий вопрос, все мои попытки не увенчались успехов. В результате я пришел к выводу что концепция константных объектов человеку полностью чужда. В этом момент я окончательно принял решение, что я не хочу с этим человеком работать в команде. В тот момент когда я это понимаю я об этом говорю сразу — отказывать людям в глаза меня не напрягает, и лишнего времени на то, чтобы задать человеку еще несколько на порядок более сложных вопросов и убедиться, что он на них тоже не ответит у меня нет. A>Плюс я считаю этот метод более честным, чем для вида еще 2 часа мучать человека, чтобы потом ему сказать "ну ок — мы подумаем и напишем наше решение".
A>Тем не менее из всей этой ситуации сделаны очень неправильные выводы. A>Разъясню свою точку зрения популярно: A>Человек был выгнан не за незнание синтаксиса. Мне вообще глубоко наплевать на знание синтаксиса. Вообще говоря у нас в Яндексе принято, что во время прохождения собеседования можно пользоваться Яндексом и Гуглем(забыл что-то, спроси у человека который тебя собеседует — он ответит). Просто об этом говорят в момент когда переходят от совсем базовых задач к сложным, где хотя бы упоминаются функции у которых имеет смысл узнавать параметры.
A>Я увидел, что человек ни разу в жизни не написал класс который можно корректно положить в STL-евский контейнер(попытка написать A*) и не понимает, что такое константность объектов(A&). Плюс с очевидных подсказок не может придумать это прямо во время собеседования(я взял на работу пару студентов, которые не знали, но делали несколько логичных предположений на собеседовании и в результате решали задачу — здесь этого не произошло).
A>Работать с таким человеком я не захотел. Может быть я злой и циничный человек.
A>P.S. Для информации — задача здесь была вообще не на конструктор копирования — просто я не успел ее задать.
A>P.P.S. В процессе я по-моему поправил несколько мелких ошибок синтаксиса типа нерасставленных * в теле конструктора, про них не упоминаю т.к. действительно не важно.
И еще хочу искренне поблагодарить за честность. Потому что я тоже предпочитаю, чтобы мне прямо сказали — "ты нам не подходишь".
На самом деле, поверьте, во время собеседования я начал сомневаться буквально во всем,правда очень сильно переволновался. Потому что много думал об этом собеседовании и о его важности накануне. Вероятно, это тоже сыграло свою роль. Ладно, прошлого уже не вернуть... буду штудировать Си++ и надеяться снова попасть в Яндекс через полгода. Это та контора, где мне действительно хочется работать.
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, Hottabych1, Вы писали:
H>>На первый (про класс Foo):
IM>Эх... Еще бы ты мог объяснить то, что процитировал.
IM>И ты не увидел самых простых и очевидных ошибок: IM>1. Деструктор невиртуальный -> утечка; IM>2. Некорректное удаление массивов -> неопределенное поведение; IM>3. Ф-ия main — void -> несоответствие стандарту.
+ Отсутствие copy-ctor'а в классе с полем-указателем.
Здравствуйте, Hottabych1, Вы писали:
H>Но я над ними долго и внимательно корпел, с компилятором и документацией, а также книжкой Кернигана. H>Вот, к примеру, мой ответ на второй вопрос (там, где галочки проставлять):
H>2) Сортированный vector позволяет, при использовании бинарного поиска, на каждом шаге отсеивать половину элементов, т.е. его сложность будет O(log2(n)) -- логарифм по снованию 2 от n (а не O(ln(n))).
Что такое временная сложность ты очевидно тоже плохо понимаешь. Константным множителям там делать нечего, а основание логарифма это ничто иное как константный множитель.
Здравствуйте, Hottabych1, Вы писали:
LM>>>>И чего Вы хотели? Вы обманули Яндекс на первом этапе. На втором Вас порезали H>>>Какая разница, как я получил верный результат? Почему бы на собеседовании не давать воспользоваться интернетом и компилятором? LM>>Потому, что некоторые вещи нужно помнить. Если ты этого не помнишь, то ты нам не нужен H>Хорошо, теперь я это помню. Возьмете?
"Ну спросите меня еще раз! Я же учил. А-а-а-а!" (с) Студент.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, branco, Вы писали:
B>>Ну, 1-й вопрос, B>>На вскидку, не заглядывая в стандарт,доки и.т.д. B>>... B>>А можно вот так:
IM>Ну раз уж мы отошли от исходной задачи "найти все ошибки" и перешли к задаче "переписать правильно", то вот мой вариант:
IM>
и глядя на твой код можно найти следующие ошибки:
1. Функция main не по стандарту
2. Доступ к базовому классу из производного установлен неправильно
3. Деструктор базового класса невиртуальный -> утечка памяти
4. Не определён конструктор по умолчанию у базового класса,а в конструкторе производного нет явной инициализации базового 5. Не применили STL(хотя — ничего смешного)
S>>Яндексу +1 раз он так быстро тебя забраковал. Я видел компании где за неимением лучьших брали и таких, но это совсем не "солидные компании" H>Напротив, очень зря меня Яндекс не взял . Да, многого не знаю, но главное, что голова есть на плечах и в сильной команде я, уверен, быстро дорасту до соответствующего уровня. А если не давать никому шанс, то скоро просто неоткуда будет брать хороших специалистов. Так как, чтобы стать таким надо пройти определенную школу, работая с сильными коллегами. А потом самому привлекать новичков, передавая им знания.
Молодой человек!(если такое обращение коробит — извиняюсь сразу)
Я за свою жизнь не написал ни строчки на плюсах (по работе, для себя кропал когда-то что-то).
В плюсах я не смыслю ни бельмеса. Я довольно слабо понимаю умные вещи, которые в этой ветке обсуждают умные люди.
Но! Мне и то понятно, что не взяли Вас правильно. Не обижайтесь, но мне кажется, что Вы делаете довольно типичную ошибку —
не усвоив и не осознав базовые концепции, видите проблему в частностях. Человек способен заучить огромный объем материала, но без понимания это мертвый груз. Практический совет — изучая что-то(собственно, неважно что именно) регулярно задавайте себе вопрос — а почему это именно так, а не иначе и что будет если сделать по другому. Помогает пониманию, знаю по опыту
В целом — удачи, уверенности в себе Вам, похоже, хватает
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, superman, Вы писали:
S>>вещью, сделанной таким образом что бы ей легко мог воспользоваться даже самый глупый человек, будет легче и приятней пользоваться и самому умному.
IM>"Создайте систему, которой сможет пользоваться каждый дурак, и только дурак захочет ей пользоваться". (с) Закон Мерфи.
Здравствуйте, superman, Вы писали:
S>>>вещью, сделанной таким образом что бы ей легко мог воспользоваться даже самый глупый человек, будет легче и приятней пользоваться и самому умному.
IM>>"Создайте систему, которой сможет пользоваться каждый дурак, и только дурак захочет ей пользоваться". (с) Закон Мерфи.
S>Хм.. а вы этим, вордом пользуетесь? а виндовсом?
Да, пользуюсь. А вы считаете, что ими может пользоваться каждый дурак?
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, superman, Вы писали:
S>>>>вещью, сделанной таким образом что бы ей легко мог воспользоваться даже самый глупый человек, будет легче и приятней пользоваться и самому умному.
IM>>>"Создайте систему, которой сможет пользоваться каждый дурак, и только дурак захочет ей пользоваться". (с) Закон Мерфи.
S>>Хм.. а вы этим, вордом пользуетесь? а виндовсом?
IM>Да, пользуюсь. А вы считаете, что ими может пользоваться каждый дурак?
ИМХО да.. именно в этом и заключалась идея, и получилось по моему действительно неплохо..
ещё когда-то я слышал про такой проэкт как "компьютер для безграмотных"
Здравствуйте, skeptik_, Вы писали:
_>Здравствуйте, Hottabych1, Вы писали:
H>>Но я над ними долго и внимательно корпел, с компилятором и документацией, а также книжкой Кернигана. H>>Вот, к примеру, мой ответ на второй вопрос (там, где галочки проставлять):
H>>2) Сортированный vector позволяет, при использовании бинарного поиска, на каждом шаге отсеивать половину элементов, т.е. его сложность будет O(log2(n)) -- логарифм по снованию 2 от n (а не O(ln(n))).
_>Что такое временная сложность ты очевидно тоже плохо понимаешь. Константным множителям там делать нечего, а основание логарифма это ничто иное как константный множитель.
За каждый раз алгоритм отсеивает половину вариантов при чем тут логарифм с основанием 2,7? Ясно, что будет просто двойка в основании. Если не прав — поправляйте.
Здравствуйте, 0rc, Вы писали:
0rc>Здравствуйте, Hottabych1, Вы писали:
H>>И еще хочу искренне поблагодарить за честность.
0rc>Пожалуйста не оверквотте!
Здравствуйте, TMU, Вы писали:
S>>>Яндексу +1 раз он так быстро тебя забраковал. Я видел компании где за неимением лучьших брали и таких, но это совсем не "солидные компании" H>>Напротив, очень зря меня Яндекс не взял . Да, многого не знаю, но главное, что голова есть на плечах и в сильной команде я, уверен, быстро дорасту до соответствующего уровня. А если не давать никому шанс, то скоро просто неоткуда будет брать хороших специалистов. Так как, чтобы стать таким надо пройти определенную школу, работая с сильными коллегами. А потом самому привлекать новичков, передавая им знания.
TMU>Молодой человек!(если такое обращение коробит — извиняюсь сразу)
TMU>Я за свою жизнь не написал ни строчки на плюсах (по работе, для себя кропал когда-то что-то). TMU>В плюсах я не смыслю ни бельмеса. Я довольно слабо понимаю умные вещи, которые в этой ветке обсуждают умные люди. TMU>Но! Мне и то понятно, что не взяли Вас правильно. Не обижайтесь, но мне кажется, что Вы делаете довольно типичную ошибку — TMU>не усвоив и не осознав базовые концепции, видите проблему в частностях. Человек способен заучить огромный объем материала, но без понимания это мертвый груз. Практический совет — изучая что-то(собственно, неважно что именно) регулярно задавайте себе вопрос — а почему это именно так, а не иначе и что будет если сделать по другому. Помогает пониманию, знаю по опыту TMU>В целом — удачи, уверенности в себе Вам, похоже, хватает
Вы абсолютно правы. Но понимай ты или не понимай концепции, а экзаменатор возьми да и спроси "какого цвета левый задний бит в тридцать шестом байте MSIL-кода скомпилированной сборки ?" И пойдешь ты гадать со своими концепциями и пониманиями . И будешь изгнан прямым и честным Анатоликсом прямо с собеседования. Или тебе будет сказано "подождать две недели, пока мы подумаем" непрямым и нечестным Гугликсом.
Здравствуйте, minorlogic, Вы писали:
M>Я понимаю , но какое именно метафизическое свойство нам гарантирует что своп не выкинет исключения ? У кого считается ?
Ну вот, например:
23.1/10 (Container requirements)
— no swap() function throws an exception unless that exception is thrown by the copy constructor or assignment operator of the container’s Compare object (if any; see 23.1.2).
Соответственно все контейнеры стандартной библиотеки это гарантируют (если ты, конечно, не засунул в него невменяемый Compare), причем независимо от типа элементов.
M>Какой механизм нам позволит делать своп для произвольных мемберов ?
Механизм сознательного следования правилу написания функций swap не бросающими исключений.
P.S. К сожалению, алгоритм swap из стандартной библиотеки этому правилу в общем виде не удовлетворяет
Так что надо писать его специализации для всех классов, которые не могут быть созданы/скопированы с гарантией отсутствия исключений.
S>раз уж вы так гордитесь своей головой-на-плечах постарайтесь обосновать полезность и принцыпы построенения такой структуры как несортированное (в общем случае неупорядоченное) дерево
Вот примеры несортированных деревьев, которые сразу в голову пришли: Выражение 2+2*2 можно выарзить в виде бинарного дерева: (+ 2 (* 2 2)). Это дерево можно уже редуцировать в конкретное значение.
XML можно представить в виде дерева — оно упорядоченно, но не отсортированно.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, minorlogic, Вы писали:
M>>Я понимаю , но какое именно метафизическое свойство нам гарантирует что своп не выкинет исключения ? У кого считается ? J>Ну вот, например: J>
23.1/10 (Container requirements)
J>— no swap() function throws an exception unless that exception is thrown by the copy constructor or assignment operator of the container’s Compare object (if any; see 23.1.2).
J>Соответственно все контейнеры стандартной библиотеки это гарантируют (если ты, конечно, не засунул в него невменяемый Compare), причем независимо от типа элементов.
M>>Какой механизм нам позволит делать своп для произвольных мемберов ? J>Механизм сознательного следования правилу написания функций swap не бросающими исключений.
J>P.S. К сожалению, алгоритм swap из стандартной библиотеки этому правилу в общем виде не удовлетворяет J>Так что надо писать его специализации для всех классов, которые не могут быть созданы/скопированы с гарантией отсутствия исключений.
Ну наконецто вы озвучили то что я пытался сказать , для применения описанного трюка , все участвующие классы должны нести соответствующую нагрузку. И данный трюк не подходит для general случая.
Здравствуйте, egaron, Вы писали:
E>Вы абсолютно правы. Но понимай ты или не понимай концепции, а экзаменатор возьми да и спроси "какого цвета левый задний бит в тридцать шестом байте MSIL-кода скомпилированной сборки ?"
Четные левые задние байты всегда красные. Это знает каждый школьник.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
E>Вы абсолютно правы. Но понимай ты или не понимай концепции, а экзаменатор возьми да и спроси "какого цвета левый задний бит в тридцать шестом байте MSIL-кода скомпилированной сборки ?" И пойдешь ты гадать со своими концепциями и пониманиями . И будешь изгнан прямым и честным Анатоликсом прямо с собеседования. Или тебе будет сказано "подождать две недели, пока мы подумаем" непрямым и нечестным Гугликсом.
У меня сложилось впечатление, что Анатоликс такого вопроса не задаст. А в места, где на основе ответов на такие вопросы, делают какие-то выводы, по-моему и ходить незачем.
Здравствуйте, Hottabych1, Вы писали:
_>>Что такое временная сложность ты очевидно тоже плохо понимаешь. Константным множителям там делать нечего, а основание логарифма это ничто иное как константный множитель.
H>За каждый раз алгоритм отсеивает половину вариантов при чем тут логарифм с основанием 2,7? Ясно, что будет просто двойка в основании. Если не прав — поправляйте.
f(n)=O(log(n)) означает, что существует число С, такое, что для каждого N f(N) <= C*log(N) + C. Или попросту, что наша функция при больших N растёт не быстрее, чем логафмическая функция, если не принимать во внимание константные множители. Поэтому основание логарифма не указывается в большом О вообще.
Кроме того, кто сказал, что дерево бинарное? Кто сказал, что это вообще дерево? Хотя все известные мне имплементации STL и используют red-black tree, но стандарт требует только логарифмического поиска и вставки, предоставляя имплементаторам самим решать, как они этого добьются.
Здравствуйте, i-maverick, Вы писали:
IM>>>3. Ф-ия main — void -> несоответствие стандарту. IM>Да, забыл добавить. В задаче же не указан компилятор. Вот VC++ нормально скушает void main(), а g++ подавится.
CodeWarrior тоже скушает. И вообще, имхо, это дефект в стандарте. Зачем спрашивается было вводить в язык как special case возможность для функции main не возвращать явно результат, вместо того чтобы узаконить void main?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, AndrewJD, Вы писали:
AJD>CodeWarrior тоже скушает. И вообще, имхо, это дефект в стандарте. Зачем спрашивается было вводить в язык как special case возможность для функции main не возвращать явно результат, вместо того чтобы узаконить void main?
Затем, что у многих программ (например, консольных) должен быть код возврата.
Тогда уж надо было запретить void.
Здравствуйте, i-maverick, Вы писали:
AJD>>И вообще, имхо, это дефект в стандарте. Зачем спрашивается было вводить в язык как special case возможность для функции main не возвращать явно результат, вместо того чтобы узаконить void main?
IM>Затем, что у многих программ (например, консольных) должен быть код возврата. IM>Тогда уж надо было запретить void.
Зачем? Было бы два варианта, в чем проблема?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, egaron, Вы писали:
E>>Вы абсолютно правы. Но понимай ты или не понимай концепции, а экзаменатор возьми да и спроси "какого цвета левый задний бит в тридцать шестом байте MSIL-кода скомпилированной сборки ?"
КД>Четные левые задние байты всегда красные. Это знает каждый школьник.
Да, а вдруг экзаменатор думает что они зеленые. Дальтоник может он....
КД>У меня сложилось впечатление, что Анатоликс такого вопроса не задаст. А в места, где на основе ответов на такие вопросы, делают какие-то выводы, по-моему и ходить незачем.
Это пример не для ув. Анатоликса, а для коллеги (забыл, проситие, ник), который "на сях писал только для себя и лабы" (как и Ваш покорный слуга), утверждающему, что главное — понимание концепции.
Здравствуйте, AndrewJD, Вы писали:
AJD>>>И вообще, имхо, это дефект в стандарте. Зачем спрашивается было вводить в язык как special case возможность для функции main не возвращать явно результат, вместо того чтобы узаконить void main?
IM>>Затем, что у многих программ (например, консольных) должен быть код возврата. IM>>Тогда уж надо было запретить void. AJD>Зачем? Было бы два варианта, в чем проблема?
Тогда к чему вообще твое предложение? Сейчас и есть два варианта. А можно и три сделать, т.к. "its type is implementation-defined".
Теперь ясно, чем занимаются в Яндексе! Концепцией константных классов и корректным вложением классов в STL-контейнеры!
Вы действительно даже не успели подойти к программированию
Вывод: в каждой компании свои заморочки...
Но не это главное!
Главное: а что Вы будете делать, Анатоликс, когда выйдет следующий стандарт C++? Переписывать весь код Яндекса?
Что, Вы будете спрашивать на собеседованиях устаревшие знания (когда STL и ссылки (&) окончательно устареют)? А если нет — то кто будет саппортить всё то, что Вы уже накодили?
Впрочем, думаю, к тому времени Вы или уволитесь, или пойдёте в большой менеджмент
А пока сообщаю: большинству компаний ни то что концепция констанных классов не нужна, им даже STL не нужен! Во как! А где-то и на ANSI C пишут! Так что нет ничего удивительного, что приходящие к Вам программисты не знают как написать конструктор копирования. И эту фигню даже не стоит спрашивать на собеседовании, ага
Здравствуйте, egaron, Вы писали:
E>>>Вы абсолютно правы. Но понимай ты или не понимай концепции, а экзаменатор возьми да и спроси "какого цвета левый задний бит в тридцать шестом байте MSIL-кода скомпилированной сборки ?"
КД>>Четные левые задние байты всегда красные. Это знает каждый школьник.
E>Да, а вдруг экзаменатор думает что они зеленые. Дальтоник может он....
Если ты своими глазами видел что они именно красные и у тебя есть справка окулиста, что ты не дальтоник, то экзаменатору можно смело указать на стену
PS. Anatolix сидит и думает — "выпендривайтесь, выпендривайтесь ...". Бугага
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, THESERG, Вы писали:
THE>Но не это главное! THE>Главное: а что Вы будете делать, Анатоликс, когда выйдет следующий стандарт C++? Переписывать весь код Яндекса? THE>Что, Вы будете спрашивать на собеседованиях устаревшие знания (когда STL и ссылки (&) окончательно устареют)? А если нет — то кто будет саппортить всё то, что Вы уже накодили?
Не смешите его тапочки
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, THESERG, Вы писали:
THE>Но не это главное! THE>Главное: а что Вы будете делать, Анатоликс, когда выйдет следующий стандарт C++? Переписывать весь код Яндекса? THE>Что, Вы будете спрашивать на собеседованиях устаревшие знания (когда STL и ссылки (&) окончательно устареют)? А если нет — то кто будет саппортить всё то, что Вы уже накодили?
Здравствуйте, THESERG, Вы писали:
THE>А пока сообщаю: большинству компаний ни то что концепция констанных классов не нужна, им даже STL не нужен! Во как! А где-то и на ANSI C пишут! Так что нет ничего удивительного, что приходящие к Вам программисты не знают как написать конструктор копирования. И эту фигню даже не стоит спрашивать на собеседовании, ага
Какая разница где и на чем пишут. Где-то пишут на Коболе, где-то на FoxPro.
Яндексу очевидно был нужен программист знающий C++.
Если человек способный к обучению то его конечно можно всему обучить, но сказал что компания не имеет права нанимать кандидатов, которых базовым вещам учить не нужно. Ну вот не хотят они ждать год или два пока человек станет специалистом по C++, у них уже сейчас есть код, который нужно поддерживать и развивать. И в этом коде наверняка встречаются конструкторы копирования
MS на многие свои позиции требует наличия опыта по соответствующим технологиям от 5 лет, а на другие вакансии они набирают студентов только-что окончивших университет.
Здравствуйте, minorlogic, Вы писали:
M>Ну наконецто вы озвучили то что я пытался сказать , для применения описанного трюка , все участвующие классы должны нести соответствующую нагрузку. И данный трюк не подходит для general случая.
подходит, если ты свой общий случай будешь хранить не по значению, а по указателю
swap указателей — операция безболезненная
Здравствуйте, THESERG, Вы писали:
THE>Главное: а что Вы будете делать, Анатоликс, когда выйдет следующий стандарт C++? Переписывать весь код Яндекса? THE>Что, Вы будете спрашивать на собеседованиях устаревшие знания (когда STL и ссылки (&) окончательно устареют)? А если нет — то кто будет саппортить всё то, что Вы уже накодили?
THE>А пока сообщаю: большинству компаний ни то что концепция констанных классов не нужна, им даже STL не нужен! Во как! А где-то и на ANSI C пишут! Так что нет ничего удивительного, что приходящие к Вам программисты не знают как написать конструктор копирования. И эту фигню даже не стоит спрашивать на собеседовании, ага
Здравствуйте, jazzer, Вы писали:
M>>Ну наконецто вы озвучили то что я пытался сказать , для применения описанного трюка , все участвующие классы должны нести соответствующую нагрузку. И данный трюк не подходит для general случая.
J>подходит, если ты свой общий случай будешь хранить не по значению, а по указателю J>swap указателей — операция безболезненная
При монопольном доступе к обоим указателям
Бугагага
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, THESERG, Вы писали:
THE>Главное: а что Вы будете делать, Анатоликс, когда выйдет следующий стандарт C++? Переписывать весь код Яндекса? THE>Что, Вы будете спрашивать на собеседованиях устаревшие знания (когда STL и ссылки (&) окончательно устареют)? А если нет — то кто будет саппортить всё то, что Вы уже накодили?
Да вроде текущий стандарт уже не первый, и вообще было время когда его не было. Как-то ни у кого особых проблем не вызывало.
У Java и C# вон вообще раз в год новые версии выходят — как то живут люди.
THE>А пока сообщаю: большинству компаний ни то что концепция констанных классов не нужна, им даже STL не нужен! Во как! А где-то и на ANSI C пишут!
Не может быть? Правда что ли? Да страшные времени наступили...
Мне тут недавно кто-то говорил, что в некоторых компания даже не на Ansi C пишут, но и на C#, Java, а то и на Visual Basic.
Представляешь? Вот так прямо в вакансии и написали: Visual Basic. Нет ну вы подумайте только!
THE>Так что нет ничего удивительного, что приходящие к Вам программисты не знают как написать конструктор копирования. И эту фигню даже не стоит спрашивать на собеседовании, ага
Ага да, спасибо большое, вы мне просто открыли глаза. Действительно разработчик на Ansi C не может знать что такое конструктор копирования. Не знаю даже как быть уж и на сайте писал что нужен C++ и STL, в резюме слова такие искал. А ведь представьте, придет вот ко мне разработчик на Lisp на такую вакансию, не заметив что там C++ нужен, я его спрошу про конструктор копирования, а он вообще слова то такого не знает. Что делать, как жить дальше
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, minorlogic, Вы писали:
M>>Ну наконецто вы озвучили то что я пытался сказать , для применения описанного трюка , все участвующие классы должны нести соответствующую нагрузку. И данный трюк не подходит для general случая.
J>подходит, если ты свой общий случай будешь хранить не по значению, а по указателю J>swap указателей — операция безболезненная
В общем случае нам придется свести все к частному случаю без обид .. звучит прикольно.
Я бы все-таки хотел уточнить... через полгода мне опять задания посылать и ждать ответа? А вдруг мне не ответят? Можно будет сразу с Вами как-то связаться?
я полностью согласен с Вашими критериями отбора, но при этом мне непонятно следующее — если у Вас столь высококвалифицированный коллектив, почему у Вас столько ошибок в HTML-коде?
Внимание jazzer-у, стандартов мы не обсуждали, был конкретный класс с написанными членами, и конкретная ситуация в которой конструктор не работал, т.к. не компилился
абсолютно согласен.
это немножко другого уровня уже обсуждение получается, и выходить на такой уровень должен точно не интервьюер.
Скажем так, мне еще ни разу в реальной жизни не пришлось написать конструктор копирования по неконстантной ссылке. Да и в нереальной тоже, пожалуй.
А если человек демонстрирует непонимание константности в С++ — о чем тут еще говорить...
Здравствуйте, jazzer, Вы писали: J>А если человек демонстрирует непонимание константности в С++ — о чем тут еще говорить...
Ну и что? Проходит 10 секунд, которые уходят на сверку со справочником и вот уже человек понимает константность. Это что, такая офигенно сложная штука?
Здравствуйте, Hottabych1, Вы писали:
J>>А если человек демонстрирует непонимание константности в С++ — о чем тут еще говорить...
H>Ну и что? Проходит 10 секунд, которые уходят на сверку со справочником и вот уже человек понимает константность. Это что, такая офигенно сложная штука?
Тебе дали больше, чем 10 секунд. Тебе дали целых полгода! Читай, учись, понимай! Никто даже подгонять не будет.
Здравствуйте, Hottabych1, Вы писали:
H>Здравствуйте, jazzer, Вы писали: J>>А если человек демонстрирует непонимание константности в С++ — о чем тут еще говорить...
H>Ну и что? Проходит 10 секунд, которые уходят на сверку со справочником и вот уже человек понимает константность. Это что, такая офигенно сложная штука?
Здравствуйте, Hottabych1, Вы писали:
H>Здравствуйте, jazzer, Вы писали: J>>А если человек демонстрирует непонимание константности в С++ — о чем тут еще говорить...
H>Ну и что? Проходит 10 секунд, которые уходят на сверку со справочником и вот уже человек понимает константность. Это что, такая офигенно сложная штука?
Нет
Константность — это из области базовых знаний, за которыми в справочник лазить нельзя.
Это все равно что ученый будет лазить в справочник за определением экспоненты.
Если человек лезет в справочник, чтобы узнать, что такое сonst — этот человек еще студент и работать ему рановато — сначала надо выучиться.
Здравствуйте, Hottabych1, Вы писали:
H>Здравствуйте, jazzer, Вы писали: J>>А если человек демонстрирует непонимание константности в С++ — о чем тут еще говорить...
H>Ну и что? Проходит 10 секунд, которые уходят на сверку со справочником и вот уже человек понимает константность. Это что, такая офигенно сложная штука?
Кстати, а какой конкретно справочник ты предпочетаеш? Мне бы пригодился такой где всё что угодно можно найти и переварить за 10 секунд
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Hottabych1, Вы писали:
H>>Здравствуйте, jazzer, Вы писали: J>>>А если человек демонстрирует непонимание константности в С++ — о чем тут еще говорить...
H>>Ну и что? Проходит 10 секунд, которые уходят на сверку со справочником и вот уже человек понимает константность. Это что, такая офигенно сложная штука?
J>Нет J>Константность — это из области базовых знаний, за которыми в справочник лазить нельзя. J>Это все равно что ученый будет лазить в справочник за определением экспоненты. J>Если человек лезет в справочник, чтобы узнать, что такое сonst — этот человек еще студент и работать ему рановато — сначала надо выучиться.
Все эти базовые вещи проходятся в ВУЗе на первом курсе или в школе в 10м классе, потом за ненадобностью благополучно забываются. Не забудутся только если их использовать в работе, а на работу не возьмут, если ты их не использовал. Если человек еще студент, но с желанием учиться и развиваться дальше, то следует ему в этом помочь — в конце концов это инвестиция фирмы. Или, может, Вы родились, уже зная Си++ и STL?
Здравствуйте, Hottabych1, Вы писали:
J>>А если человек демонстрирует непонимание константности в С++ — о чем тут еще говорить...
H>Ну и что? Проходит 10 секунд, которые уходят на сверку со справочником и вот уже человек понимает константность. Это что, такая офигенно сложная штука?
Помню, в детстве залез на сайт C++ гуру. И уполз оттуда после не сумев понять смысл ниже представленных конструкций:
const T* val;
T* const val;
const T* const val;
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Hottabych1, Вы писали:
J>>А если человек демонстрирует непонимание константности в С++ — о чем тут еще говорить... H>Ну и что? Проходит 10 секунд, которые уходят на сверку со справочником и вот уже человек понимает константность. Это что, такая офигенно сложная штука?
В этом и проблема, что она настолько простая и базовая, что ее незнание не позволяет надеяться на то что и остальные, чуть более сложные вещи знакомы соискателю.
А c++ тем и плох, что там таких 10-секундных тем — тонна.
Здравствуйте, Hottabych1, Вы писали:
H>Все эти базовые вещи проходятся в ВУЗе на первом курсе или в школе в 10м классе, потом за ненадобностью благополучно забываются. Не забудутся только если их использовать в работе, а на работу не возьмут, если ты их не использовал.
Э-э-э...
Ну что я могу сказать...
Если ты работал программистом на С++ и при этом у тебя const забылся "за ненадобностью", потому что "ты их не использовал" — я бы тебя не взял на работу хотя бы потому, что твой предыдущий опыт работы развил в тебе плохие привычки программирования, с которыми мне же потом и придется сражаться. В этом плане действительно лучше брать зеленых выпускников, которые еще не успели набраться всякой дряни, и выращивать из них нормальных программистов. Но это при условии что на рынке нет профессионалов, что в России далеко не так.
H>Если человек еще студент, но с желанием учиться и развиваться дальше, то следует ему в этом помочь — в конце концов это инвестиция фирмы.
Поставь себя на место владельца фирмы и подумай, в кого выгоднее инвестировать — в новичка или в профессионала.
H>Или, может, Вы родились, уже зная Си++ и STL?
Конечно же, нет. Я работал на part-time за $350 в месяц. И ни в какие конторы уровня Яндекса или Google не лез. Потому что отлично осознавал свой тогдашний уровень.
P.S. Ты зря упорствуешь и ставишь форум на уши. Ничего страшного не произошло. Тебе указали на конкретные пробелы в твоих знаниях — закрывай их. В конце концов, твоя цель ведь — стать высокооплачиваемым профессионалом, а не просто числиться в Яндексе. Я знаю нескольких человек, которым было отказано на собеседованиях в те фирмы, в которые они мечтали устроиться, но они не пошли плакаться на форум, а пошли учиться, и сейчас они повторные интервью в те же самые конторы проходят без напрягов.
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, jazzer, Вы писали:
J>>Здравствуйте, minorlogic, Вы писали:
M>>>Ну наконецто вы озвучили то что я пытался сказать , для применения описанного трюка , все участвующие классы должны нести соответствующую нагрузку. И данный трюк не подходит для general случая.
J>>подходит, если ты свой общий случай будешь хранить не по значению, а по указателю J>>swap указателей — операция безболезненная
M>В общем случае нам придется свести все к частному случаю без обид .. звучит прикольно.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, jazzer, Вы писали:
M>>>Ну наконецто вы озвучили то что я пытался сказать , для применения описанного трюка , все участвующие классы должны нести соответствующую нагрузку. И данный трюк не подходит для general случая.
J>>подходит, если ты свой общий случай будешь хранить не по значению, а по указателю J>>swap указателей — операция безболезненная
КД>При монопольном доступе к обоим указателям
КД>Бугагага
Здравствуйте, Hottabych1, Вы писали:
H>Все эти базовые вещи проходятся в ВУЗе на первом курсе или в школе в 10м классе, потом за ненадобностью благополучно забываются. Не забудутся только если их использовать в работе, а на работу не возьмут, если ты их не использовал.
Хотабыч открыл Америку!
H>Если человек еще студент, но с желанием учиться и развиваться дальше, то следует ему в этом помочь — в конце концов это инвестиция фирмы.
Лучшие инвестиции это те, которые ты сам для себя сделал
А, типа, "господа, вкладывайте в меня бабки и я стану умным ... ну и так далее" — это убого.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, jazzer, Вы писали:
J>>>swap указателей — операция безболезненная
КД>>При монопольном доступе к обоим указателям
КД>>Бугагага
J>сорри, не понял, расшифруй свою мысль
Ну я в контексте мысли "что может свалить то, что свалить нельзя".
Если (тупой) объект используется в разных потоках, то вполне можем переместить недействительный указатель.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Если (тупой) объект используется в разных потоках, то вполне можем переместить недействительный указатель.
Ну это к swap прямого отношения не имеет.
Ты ту же самую проблему получишь, используя pimpl
Здравствуйте, Hottabych1, Вы писали:
H>Все эти базовые вещи проходятся в ВУЗе на первом курсе или в школе в 10м классе, потом за ненадобностью благополучно забываются. Не забудутся только если их использовать в работе, а на работу не возьмут, если ты их не использовал.
Вот я действующий студент, уже полтора года работаю. Работаю я в местной конторе, а т.к. в городе плохо с кадрами, то берут кого угодно, ну разве что не берут совсем тупых. Вот почему бы тебе не пойти туда, где проще, приобрести опыт и попробовать устроиться туда, куда ты хотел бы. Что ж ты раньше то не думал?
Да и работа — штука относительная. Я вот когда пришёл на собеседование, уже представлял себе, что такое const в C++, хотя мне это было не надо, т.к. пишем всё на C#. А всё потому, что до этого я сам мучил C++. Книжки читал, понимал, зачем нужна эта концепция и т.д. Ведь если ты понимаешь, зачем вообще в C++ был введён const, то ты вряд ли забудешь, как он используется. Потом ещё для себя задачки интересные придумывал, реализовывал.
Кстати, небольшой оффтоп — сейчас пишу на C# и тяжело приходится без const — приходится явно писать интерфейс вида IConstXXX и наследовать от него IXXX. Хотя, const тоже пораждает немало граблей. Так что, может оно и к лучшему.
H>Если человек еще студент, но с желанием учиться и развиваться дальше, то следует ему в этом помочь — в конце концов это инвестиция фирмы. Или, может, Вы родились, уже зная Си++ и STL?
Если у человека действительно есть желание учиться и развиваться, он возьмёт и будет развиваться. И не надо уповать на злых дядек, которые тебе в этом мешают.
Я никого ни в чем не обвиняю. Изначально просто интересовало мнение публики, насколько, по вашему мнению, важно знание именно синтаксиса языка Си++, конструкций языка. И совершенно при этом не снимаю с себя ответственности за убитое интервью. Потому что в каждой компании есть те или иные требования к кандидатам формального характера. Меня лишь интересует, насколько верен такой подход вообще, в целом, во всей индустрии. И какой способ отбора кандидатов является наиболее объективным. Все эти консты и конструкторы копирования лишь частности.
Здравствуйте, Hottabych1, Вы писали:
H>Я никого ни в чем не обвиняю. Изначально просто интересовало мнение публики, насколько, по вашему мнению, важно знание именно синтаксиса языка Си++, конструкций языка. И совершенно при этом не снимаю с себя ответственности за убитое интервью. Потому что в каждой компании есть те или иные требования к кандидатам формального характера. Меня лишь интересует, насколько верен такой подход вообще, в целом, во всей индустрии. И какой способ отбора кандидатов является наиболее объективным. Все эти консты и конструкторы копирования лишь частности.
Речь не о синтаксисе/конструкциях, а об идеологии, идеях и идиомах.
Т.е. если бы ты не стал писать, а сказал словами: "конструтор копирования принимает константную ссылку на А" — вряд ли стали бы обязательно проверять, можешь ли ты это записать без ошибок на бумаге, по крайней мере, вес неправильно записанного был бы намного ниже.
А если человек не знаком с идиомами и общими приемами — он еще не профессионал, ему еще стоит подучиться, вот и все.
H>Я никого ни в чем не обвиняю. Изначально просто интересовало мнение публики, насколько, по вашему мнению, важно знание именно синтаксиса языка Си++, конструкций языка. И совершенно при этом не снимаю с себя ответственности за убитое интервью. Потому что в каждой компании есть те или иные требования к кандидатам формального характера. Меня лишь интересует, насколько верен такой подход вообще, в целом, во всей индустрии. И какой способ отбора кандидатов является наиболее объективным. Все эти консты и конструкторы копирования лишь частности.
Я вообще не понимаю, как это — верен в индустрии???
У компании есть необходимость в специалисте, она сама по собственному усмотрению
устраивает собеседования и решает подходит он ей или нет. И пофиг этой компании как
вся остальная индустрия решает этот вобщем-то интимный вопрос.
Здравствуйте, Hottabych1, Вы писали:
H> Меня лишь интересует, насколько верен такой подход вообще, в целом, во всей индустрии. И какой способ отбора кандидатов является наиболее объективным. Все эти консты и конструкторы копирования лишь частности.
О боже.. в последний раз Ответ:
ИМХО Для того что бы заниматься профессиональным програмированием на С++ необходимо знать что такое конструктор копирования, какова его сигнатура и понимать почему у него константный параметр! Это необходимое условие, но никак не достаточное . Это знать необходимо. Все возможные исключения либо специфика кадровой политики данной конкретной компании, либо исключения подтверждающие правило.
Здравствуйте, Hottabych1, Вы писали:
H>Я никого ни в чем не обвиняю. Изначально просто интересовало мнение публики, насколько, по вашему мнению, важно знание именно синтаксиса языка Си++, конструкций языка. И совершенно при этом не снимаю с себя ответственности за убитое интервью. Потому что в каждой компании есть те или иные требования к кандидатам формального характера. Меня лишь интересует, насколько верен такой подход вообще, в целом, во всей индустрии. И какой способ отбора кандидатов является наиболее объективным. Все эти консты и конструкторы копирования лишь частности.
Вот читаю форум и не совсем понимаю. На собеседованиях проверяют знания. Разные. Например, на яндексе проверяют как человек реально знает C++. В MS проверяют (из языка) главным образом только алгоритмы и те простые (правда заставляют писать на бумажке, что сложнее).
Что конкретно ты знаешь? С++ — вроде нет пока. Алгоритмы — вроде тоже нет. Как ты хочешь, чтобы работодатель предпочел тебя другим? По каким параметрам? Что светлая голова — имхо не понимаю — это же тоже нужно как-то доказать. Например я прежде чем пойти устраиваться в первую контору проштудировал страуструпа, сдал brainbench > 4.6. Пописал собственные проекты. И примерно представлял (хоть как-то) что такое конструктор копирования, зачем нужен const и т.д. И могу сказать, что это не совсем 10 сек посмотрел и уже понял. Некоторые темы приходилось прорубать...
И вот уже >6 лет постоянно читаю книжки, изучаю алгоритмы и постоянно в C++(!) открываю все новые и новые возможности и более чем уверен, что их еще ну просто очень много. Я уж не говорю, что boost просто не смотрел (все равно начальство не даст добро ).
Здравствуйте, Hottabych1, Вы писали:
H>Я никого ни в чем не обвиняю. Изначально просто интересовало мнение публики, насколько, по вашему мнению, важно знание именно синтаксиса языка Си++, конструкций языка.
Еще раз повторяю: нет не нужно. тебя не взяли не за это.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
КД>>Правда в последнее время, мне в голову все чаще и чаще приходя мысли, что проектировать классы нужно так, чтобы у них вообще не было реализаций конструкторов и операторов копирования.
M>Очень здравая мысль. Я считаю что такие весчи необходимо делать только в очень маленьком к-ве случаев , например смартпоинтер.
M>Для тривиальных , небиблиотечных классов — это дурной тон.
Достаточно просто положить в класс ссылочный член с семантикой владения (например, указатель).
И придется писать конструкторы и операторы, никуда не денешься — генерящийся по умолчанию тебя не устроит.
А если у тебя там будет ссылка, а не указатель — так у тебя по умолчанию ничего и не сгенерится даже — сразу будет ошибка компиляции при попытке вызова.
Это в небиблиотечном коде сплошь и рядом и вполне тривиально.
J>Достаточно просто положить в класс ссылочный член с семантикой владения (например, указатель). J>И придется писать конструкторы и операторы, никуда не денешься — генерящийся по умолчанию тебя не устроит.
Другой вопрос — часто ли это нужно в обычной жизни? Вот мне в классе Foo нужен указатель X с семантикой владения. Допустим он владеет целой пачкой объектов типа Y:
class Foo
{
std::vector<Y> X;
};
Нужно этому классу написать конструктор копирования? Или оператор присваивания? Или пусть компилятор сгенерит?
Мой совет: забудьте про конструкторы копирования и операторы присваивания, изучите умные указатели из стандартной библиотеки и буста (если не хватает — допишите еще парочку специфичных для вас). Жизнь облегчает значительно.
Здравствуйте, sraider, Вы писали:
J>>Достаточно просто положить в класс ссылочный член с семантикой владения (например, указатель). J>>И придется писать конструкторы и операторы, никуда не денешься — генерящийся по умолчанию тебя не устроит.
S>Другой вопрос — часто ли это нужно в обычной жизни? Вот мне в классе Foo нужен указатель X с семантикой владения. Допустим он владеет целой пачкой объектов типа Y:
S>
class Foo
S>{
S> std::vector<Y> X;
S>};
И где указатель? Здесь владение по значению. А я говорил об указателе. Да и ты тоже, вроде, поначалу.
S>Нужно этому классу написать конструктор копирования? Или оператор присваивания? Или пусть компилятор сгенерит?
Этому — не нужно. Нехай генерит
S>Мой совет: забудьте про конструкторы копирования и операторы присваивания, изучите умные указатели из стандартной библиотеки и буста (если не хватает — допишите еще парочку специфичных для вас). Жизнь облегчает значительно.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, minorlogic, Вы писали:
КД>>>
КД>>>Правда в последнее время, мне в голову все чаще и чаще приходя мысли, что проектировать классы нужно так, чтобы у них вообще не было реализаций конструкторов и операторов копирования.
M>>Очень здравая мысль. Я считаю что такие весчи необходимо делать только в очень маленьком к-ве случаев , например смартпоинтер.
M>>Для тривиальных , небиблиотечных классов — это дурной тон.
J>Достаточно просто положить в класс ссылочный член с семантикой владения (например, указатель). J>И придется писать конструкторы и операторы, никуда не денешься — генерящийся по умолчанию тебя не устроит. J>А если у тебя там будет ссылка, а не указатель — так у тебя по умолчанию ничего и не сгенерится даже — сразу будет ошибка компиляции при попытке вызова.
J>Это в небиблиотечном коде сплошь и рядом и вполне тривиально.
Не знаю что есть "ссылочный член с семантикой владения " , но про указатель я писал , достаточно умный указатель использовать.
Если же вы предролагаете копировать и данные по указателю , тогда возникает вопрос , а почему там указатель а не агрегированный мембер ?
J>И где указатель? Здесь владение по значению. А я говорил об указателе. Да и ты тоже, вроде, поначалу.
X — это и есть тот самый [умный] указатель. Указывает на массив объектов, хранящихся где-то (например, на куче). И при копировании он сам копирует объекты, которыми он владеет. На то он и умный.
PS. Я полагаю тебе не нужно объяснять, что std::vector<> из себя представляет внутри ;)
Здравствуйте, jazzer, Вы писали:
H>>Или, может, Вы родились, уже зная Си++ и STL? J>Конечно же, нет. Я работал на part-time за $350 в месяц. И ни в какие конторы уровня Яндекса или Google не лез. Потому что отлично осознавал свой тогдашний уровень.
Буржуин! Я с 200 начинал
struct BaseClass {...} // все сплошь абстрактное и виртульноеstruct DerivedClass1 : BaseClass {...}
struct DerivedClass2 : BaseClass {...}
struct DerivedClass3 : BaseClass {...}
BaseClass* CoolFactory(....); // Фабрикаclass A
{
BaseClass* p;
public:
A(BaseClass* b) : p(b) {}
~A() { delete p; }
};
int main(argc, argv)
{
A a1( CoolFactory(argc, argv) );
A a2(a1);
}
Даже если ты заменишь голый указатель на любой умный по твоему выбору, избавившись от деструктора — тебе все равно придется что-то делать с копированием и присваиванием (напоминаю, нам нужна семантика владения и, соответственно, глубокого копирования).
Конечно, можно и тут навертеть чего-нть, нагенерить traits и специальных классов, которые будут умными указателями и при этом будут уметь с этими traits работать, но это уже будет совершенно нетривиально.
Например, BaseClass может предоставлять операцию clone, тогда копирование будет просто:
A::A(const A& rhs)
{
p = rhs.p->clone();
}
Или же он может предоставлять еще какую-нть информацию, которой может воспользоватсья фабрика, тогда код будет такой:
A::A(const A& rhs)
{
p = CoolFactory( rhs.p->get_info_for_copy_making() );
}
Или же он может отдавать другой объект-прототип, из которого он сам был создан:
A::A(const A& rhs)
{
p = rhs.p->get_prototype()->make_new_clone();
}
Или же вообще будет специальная функция копирования а ля strcpy:
A::A(const A& rhs)
{
base_class_cpy(p, rhs.p);
}
Иными словами, тебе в любом случае придется писать явно копирование и присваивание, просто ты это можешь сделать на разных уровнях — либо в классе A, либо создавая еще один уровень косвенности и реализуя явно присваивание и копирование для этих промежуточных классов.
Здравствуйте, minorlogic, Вы писали:
M>Если же вы предролагаете копировать и данные по указателю , тогда возникает вопрос , а почему там указатель а не агрегированный мембер ?
потому что там указатель на базовый класс. На интерфейс, если угодно.
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, jazzer, Вы писали:
H>>>Или, может, Вы родились, уже зная Си++ и STL? J>>Конечно же, нет. Я работал на part-time за $350 в месяц. И ни в какие конторы уровня Яндекса или Google не лез. Потому что отлично осознавал свой тогдашний уровень. LM>Буржуин! Я с 200 начинал
Не волнуйся, все эти заработанные непосильным трудом деньги через пару лет превратились в тыкву
И вместо квартиры мы с женой купили холодильник — хватило в обрез
веселые времена были
Здравствуйте, konsoletyper, Вы писали:
K>Кстати, небольшой оффтоп — сейчас пишу на C# и тяжело приходится без const — приходится явно писать интерфейс вида IConstXXX и наследовать от него IXXX. Хотя, const тоже пораждает немало граблей. Так что, может оно и к лучшему.
Поподробнее о выделенном можно?
Здравствуйте, greenrat, Вы писали:
G>Я уж не говорю, что boost просто не смотрел (все равно начальство не даст добро ).
И не смотри. Потом без него не сможешь
J>Конечно, можно и тут навертеть чего-нть, нагенерить traits и специальных классов, которые будут умными указателями и при этом будут уметь с этими traits работать, но это уже будет совершенно нетривиально.
Да написать новую политику копирования — это ж несколько строк. Берешь SmartPtr из Loki, создаешь политику, которая наследуется от DeepCopy, определяешь функцию Clone как тебе угодно, подсовываешь эту политику в SmartPtr и все. Дело нескольких минут.
А головной боли с конструкторами копирования и операторами присваивания гораздо больше. При добавлении нового члена в класс нужно не забыть его добавить в КК и ОП. А если КК и ОП генерируются компилятором, то он сам все сделает — можно расслабиться и получать удовольствие. :beer:
G>>>Я уж не говорю, что boost просто не смотрел (все равно начальство не даст добро :)) ). LM>>И не смотри. Потом без него не сможешь:) B>Я тоже не смотрел. Что, настолько опасно подсесть? :)
Представь: ты всю жизнь собирал велосипеды, а тут тебе подарили велосипедный завод :))
Здравствуйте, branco, Вы писали:
S>>Представь: ты всю жизнь собирал велосипеды, а тут тебе подарили велосипедный завод B>Ну, про boost::AntiСopiable уже наслышан. Попробуем продвинуться дальше.
Вообще-то он noncopyable.
Здравствуйте, branco, Вы писали:
G>>>Я уж не говорю, что boost просто не смотрел (все равно начальство не даст добро ). LM>>И не смотри. Потом без него не сможешь B>Я тоже не смотрел. Что, настолько опасно подсесть?
Посмотри boost::bind и пойми насколько просто стело делать callback-и и threadfunc(если использовать boost::thread)
class A
{
public:
long ID_;
....
};
std::vector<A> x;
Здравствуйте, sraider, Вы писали:
J>>Конечно, можно и тут навертеть чего-нть, нагенерить traits и специальных классов, которые будут умными указателями и при этом будут уметь с этими traits работать, но это уже будет совершенно нетривиально.
S>Да написать новую политику копирования — это ж несколько строк. Берешь SmartPtr из Loki, создаешь политику, которая наследуется от DeepCopy, определяешь функцию Clone как тебе угодно, подсовываешь эту политику в SmartPtr и все. Дело нескольких минут.
Ну Локи — да, а вот в бусте — нет
В принципе, по этому поводу Александреску с бустовцами грызся в довольно грубой форме.
Он очень оскорбился, что shared_ptr вставят в новый стандарт, а про него ни словом не упомянут.
На что ему вежливо ответили, что с его стороны, к сожалению, не видно оформленного по всем правилам пропозла для стандарта.
А жаль, мне его подход больше нравится.
S>А головной боли с конструкторами копирования и операторами присваивания гораздо больше. При добавлении нового члена в класс нужно не забыть его добавить в КК и ОП. А если КК и ОП генерируются компилятором, то он сам все сделает — можно расслабиться и получать удовольствие.
Если есть Локи — то да. Если нет — то нет, зачастую проще написать конструктор самому. Ты же не будешь утверждать, что SmartPtr из Локи тривиален.
Ну и, кстати, оператор присваивания по умолчанию даже с такими клёвыми умными членами не обеспечивает сильной гарантии безопасности.
Т.е. если у тебя два клонирующихся члена и клонирование второго возбуждает исключение — главный объект оказывается в интересном состоянии.
Здравствуйте, jazzer, Вы писали:
J>Ну и, кстати, оператор присваивания по умолчанию даже с такими клёвыми умными членами не обеспечивает сильной гарантии безопасности. J>Т.е. если у тебя два клонирующихся члена и клонирование второго возбуждает исключение — главный объект оказывается в интересном состоянии.
Это почему?
Здравствуйте, LuciferMoscow, Вы писали:
K>>Кстати, небольшой оффтоп — сейчас пишу на C# и тяжело приходится без const — приходится явно писать интерфейс вида IConstXXX и наследовать от него IXXX. Хотя, const тоже пораждает немало граблей. Так что, может оно и к лучшему. LM>Поподробнее о выделенном можно?
Это вообще тема отдельная. Как то на форуме обсуждали множественно наследование. Вероятно, разработчики Java/C# решили, что обилие в программе const/mutable может сделать код нечитабельным и запутанным, как и в случае с множественным наследованием. А с интерфейсам всё проще — передали методу объект, реализующий такой-то интерфейс, а метод только согласно этому интерфейсу действовать и может, всё просто и понятно. В язык можно понатащить чего угодно, упрощающего жизнь, только порой такая неумеренность может жизнь усложнить. Думаю, тут нужно соблюдать меру и не ударяться в одну из крайностей (слишком просто, слишком сложно). Вот, например, в C++ есть const, зато нет паттерн-матчинга и алгебраических типов. В одних задачах приходится материться на разработчиков C++, в других случаях на разработчиков Немерле. Правда как показала моя практика (насчёт всеобщей не знаю), на разработчиков Nemerle (да и C#) мне приходилось материться гораздо меньше.
Мне бы было интересно узнать, что по этому поводу говорят сами разработчики. Правда, скорее всего, они говорят как раз о простоте языка. Ну не знаю, это вопрос спорный.
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, jazzer, Вы писали:
J>>Ну и, кстати, оператор присваивания по умолчанию даже с такими клёвыми умными членами не обеспечивает сильной гарантии безопасности. J>>Т.е. если у тебя два клонирующихся члена и клонирование второго возбуждает исключение — главный объект оказывается в интересном состоянии. LM>Это почему?
Потому что первый член уже успешно скопировался.
В результате ты получаешь объект, у которого один член новый, а другой — старый.
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, minorlogic, Вы писали:
M>>Очень здравая мысль. Я считаю что такие весчи необходимо делать только в очень маленьком к-ве случаев , например смартпоинтер. M>>Для тривиальных , небиблиотечных классов — это дурной тон.
AJD>Аргументы?
Банальнейший пример из жизни.
Я написал конструктор копирования , а некто потом добавил новый мембер в класс... И теперь раз когда такое происходит , надо не забыть вставить копирование мембера в констрктор копирования и т.д.
... K>Я считаю, что знание синтаксиса вообще является второстепенным. Выучить синтаксис любого языка программирования можно за несколько дней, если понимать концепции, которые этот синтаксис отражает. Но для экзаменатора вопросы по синтаксису — это самое очевидное, что он может предложить кандидату.
Последний рекорд , я слышал что С++ можно за 2 недели выучить , а вы за несколько дней !
LM>Посмотри boost::bind и пойми насколько просто стело делать callback-и и threadfunc(если использовать boost::thread)
Ну для callback'ов лучше все-таки boost::function.
bind для другого предназначен.
ЗЫ: в boost::lambda лучше вообще не смотри. Сначала крыша съедет, а потом придется посылать лесом все конторы, где boost запрещён по т.н. "административным" причинам (в переводе на русский — это когда тим лид не знает буста).
J>В принципе, по этому поводу Александреску с бустовцами грызся в довольно грубой форме. J>Он очень оскорбился, что shared_ptr вставят в новый стандарт, а про него ни словом не упомянут. J>На что ему вежливо ответили, что с его стороны, к сожалению, не видно оформленного по всем правилам пропозла для стандарта. J>А жаль, мне его подход больше нравится.
А мне не жаль, нет ничего хуже, чем разбираться в плохо оформленном коде, без грамотных описаний. Стандарт сделан так, что его даже дуболом должен уметь понять.
Здравствуйте, SkyDance, Вы писали:
SD>ЗЫ: в boost::lambda лучше вообще не смотри. Сначала крыша съедет, а потом придется посылать лесом все конторы, где boost запрещён по т.н. "административным" причинам (в переводе на русский — это когда тим лид не знает буста).
Угу, или по условиям заказчика используется компилятор не поддерживающий даже шаблоны
Здравствуйте, minorlogic, Вы писали:
AJD>>Аргументы?
M>а некто потом добавил новый мембер в класс... И теперь раз когда такое происходит , надо не забыть вставить копирование мембера в констрктор копирования и т.д.
Это из серии:
И теперь раз когда такое происходит, надо не забыть вставить инициализацию мембера в констрктор
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, SkyDance, Вы писали:
SD>ЗЫ: в boost::lambda лучше вообще не смотри. Сначала крыша съедет, а потом придется посылать лесом все конторы, где boost запрещён по т.н. "административным" причинам (в переводе на русский — это когда тим лид не знает буста).
Как насчет значительного увеличения времени компиляции при использовании boost::lambda ?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, SkyDance, Вы писали:
SD>А мне не жаль, нет ничего хуже, чем разбираться в плохо оформленном коде, без грамотных описаний. Стандарт сделан так, что его даже дуболом должен уметь понять.
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, minorlogic, Вы писали:
AJD>>>Аргументы?
M>>а некто потом добавил новый мембер в класс... И теперь раз когда такое происходит , надо не забыть вставить копирование мембера в констрктор копирования и т.д.
AJD>Это из серии: AJD>И теперь раз когда такое происходит, надо не забыть вставить инициализацию мембера в констрктор
Нет , тут другая ситуация. Вежливый и заботливый мембер, сам себя проинициализирует , если это так важно , или подскажет с помошью компилятора что инициализация нужна явно.
Здравствуйте, minorlogic, Вы писали:
M>Нет , тут другая ситуация. Вежливый и заботливый мембер, сам себя проинициализирует , если это так важно , или подскажет с помошью компилятора что инициализация нужна явно.
Добавляем в класс счетчик:
int m_counter;
Чем он сам себя проинициализирует?
Здравствуйте, minorlogic, Вы писали:
M>Нет , тут другая ситуация. Вежливый и заботливый мембер, сам себя проинициализирует , если это так важно , или подскажет с помошью компилятора что инициализация нужна явно.
Ровна такая же.
Вежливый и заботливый мембер, сам себя правильно скопирует, или подскажет с помошью компилятора что он некопируемый.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, SkyDance, Вы писали:
J>>В принципе, по этому поводу Александреску с бустовцами грызся в довольно грубой форме. J>>Он очень оскорбился, что shared_ptr вставят в новый стандарт, а про него ни словом не упомянут. J>>На что ему вежливо ответили, что с его стороны, к сожалению, не видно оформленного по всем правилам пропозла для стандарта. J>>А жаль, мне его подход больше нравится.
SD>А мне не жаль, нет ничего хуже, чем разбираться в плохо оформленном коде, без грамотных описаний. Стандарт сделан так, что его даже дуболом должен уметь понять.
Имелось ввиду, что он нормально не оформил предложение в комитет по стандартизации. Да пусть бустовского хоть добавят и то спасибо сказать можно . А Локи можно всегда и так пользовать . Да и свой велосипед по мотивам написать не трудно .
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, minorlogic, Вы писали:
M>>Нет , тут другая ситуация. Вежливый и заботливый мембер, сам себя проинициализирует , если это так важно , или подскажет с помошью компилятора что инициализация нужна явно.
IM>Добавляем в класс счетчик: IM>int m_counter; IM>Чем он сам себя проинициализирует?
А "int m_counter;" это не очень вежливый мембер. Если нужна гарантия инициализации используйте обертку над int
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, minorlogic, Вы писали:
M>>Нет , тут другая ситуация. Вежливый и заботливый мембер, сам себя проинициализирует , если это так важно , или подскажет с помошью компилятора что инициализация нужна явно.
AJD>Ровна такая же.
AJD>Вежливый и заботливый мембер, сам себя правильно скопирует, или подскажет с помошью компилятора что он некопируемый.
Здравствуйте, minorlogic, Вы писали:
M>>>Нет , тут другая ситуация. Вежливый и заботливый мембер, сам себя проинициализирует AJD>>Вежливый и заботливый мембер, сам себя правильно скопирует,
M>Ну , да. Я сказал что то противоречещее ?
ИМХО, пример с новым мембером не удачный для аргументирования "плохого" тона обьектов с копирующими конструкторами.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, LuciferMoscow, Вы писали:
) LM>Посмотри boost::bind и пойми насколько просто стело делать callback-и и threadfunc(если использовать boost::thread) LM>
LM>class A
LM>{
LM>public:
LM> long ID_;
LM> ....
LM>};
LM>std::vector<A> x;
LM>
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, minorlogic, Вы писали:
M>>>>Нет , тут другая ситуация. Вежливый и заботливый мембер, сам себя проинициализирует AJD>>>Вежливый и заботливый мембер, сам себя правильно скопирует,
M>>Ну , да. Я сказал что то противоречещее ?
AJD>ИМХО, пример с новым мембером не удачный для аргументирования "плохого" тона обьектов с копирующими конструкторами.
получается, что "вежливый и заботливый мембер" с нетривиальными конструктором копирования и оператором присваивания являет собой образец "плохого тона"
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, minorlogic, Вы писали:
M>>А "int m_counter;" это не очень вежливый мембер. Если нужна гарантия инициализации используйте обертку над int
IM>Как по мне, так проще не забыть проинициализировать, чем делать обертку для каждого POD-типа.
Ну зачем же для каждого ... одну обертку на всех , шаблонную. Не вижу особых проблем, даже в некоторых приложениях , это может быть очень важно.
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, minorlogic, Вы писали:
M>>>>Нет , тут другая ситуация. Вежливый и заботливый мембер, сам себя проинициализирует AJD>>>Вежливый и заботливый мембер, сам себя правильно скопирует,
M>>Ну , да. Я сказал что то противоречещее ?
AJD>ИМХО, пример с новым мембером не удачный для аргументирования "плохого" тона обьектов с копирующими конструкторами.
Дык почему же плохой ? Я почти каждый день сталкиваюсь . У нас у одного высокого товарища , как раз такая вот привычка , писать копирующие конструкторы где надо и где не надо. В итоге новые члены теряютбся систематически.
Привет, ты не один такой.
Я когдато вышел на улицу после собеседования, и у меня реально были мысли что я не просто ничего не знаю,
что программирование это вобще не мое, что я не в той области работаю ))). Правда через 5-10 минут, реакция преобразовалась в следующюю: "Это я ничего не знаю?, я вам еще покажу! )))"
На след день поехал закупаться книгами (потому что пишу я на Perl, но нечитал не одной книги по нему).
И ушел сголовой в чтение, оказывается так много нового.
А насчет констрктора копирования, ну слажал немного.
хотя я сам так не любил эти вопросы по синтаксису, бе ))))
Здравствуйте, minorlogic, Вы писали:
M>Последний рекорд , я слышал что С++ можно за 2 недели выучить , а вы за несколько дней !
Там написано "если понимать концепции, которые этот синтаксис отражает". Разумеется, если не представлять, зачем нужны шаблонные аргументы шаблонов, то освоение их синтаксиса никак не приблизит нас к освоению этой части языка. С другой стороны использование этих самых шаблонных аргументов не является необходимым для создания успешных программ. Многие другие вещи хоть и не обязательны, но желательны. Однако научиться, например, использовать модификатор const, по-моему можно не то что за несколько дней, а, как говорится, "не отходя от кассы".
Здравствуйте, AndrewJD, Вы писали:
AJD>Как насчет значительного увеличения времени компиляции при использовании boost::lambda ?
Никак. Время сборки — не ресурс, если у тебя не в одном файле весь проект, конечно же.
Уж чем-чем, а временем сборки за удобство можно заплатить, а грамотная модульность уменьшает время сборки в разы.
Здравствуйте, SkyDance, Вы писали:
LM>>Посмотри boost::bind и пойми насколько просто стело делать callback-и и threadfunc(если использовать boost::thread) SD>Ну для callback'ов лучше все-таки boost::function. SD>bind для другого предназначен.
А как ты этот буст::функтион сделаешь? Биндом
Здравствуйте, jazzer, Вы писали:
M>>Последний рекорд , я слышал что С++ можно за 2 недели выучить , а вы за несколько дней !
J>Я в своих руках держал книжку (жалко, фотоаппарата не было с собой) "С++ за 24 часа".
Какой-то несчастный C++... Вот у меня была (довольно мутная) книженция "Освой OLE за 21 день". Я её осваивал полтора года. Потом она согласилась таки выйти за меня замуж
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
J>Никак. Время сборки — не ресурс, если у тебя не в одном файле весь проект, конечно же. J>Уж чем-чем, а временем сборки за удобство можно заплатить, а грамотная модульность уменьшает время сборки в разы.
Поддерживаю.
У тимлидов вообще находится очень много "аргументов", лишь бы не показать свою малограмотность в использовании разных технологий и библиотек. Возможно, это одна из причин, по которым тим лид не должен быть слишком молодым (тащит что ни попадя в проект), ни слишком старым (боится любых перемен).
Здравствуйте, SkyDance, Вы писали:
SD>У тимлидов вообще находится очень много "аргументов", лишь бы не показать свою малограмотность в использовании разных технологий и библиотек. Возможно, это одна из причин, по которым тим лид не должен быть слишком молодым (тащит что ни попадя в проект), ни слишком старым (боится любых перемен).
Во-во... boost::lambda это какраз то самое что попало...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Anatolix, Вы писали:
A>Ага да, спасибо большое, вы мне просто открыли глаза. Действительно разработчик на Ansi C не может знать что такое конструктор копирования. Не знаю даже как быть уж и на сайте писал что нужен C++ и STL, в резюме слова такие искал. А ведь представьте, придет вот ко мне разработчик на Lisp на такую вакансию, не заметив что там C++ нужен, я его спрошу про конструктор копирования, а он вообще слова то такого не знает. Что делать, как жить дальше
Ужасть просто. Анатолий, проси молоко за вредность работы.
А ну как завтра С++ отменят? Сколько вам придется в яндексе переписывать. Так что молоко уже сейчас надо выбивать себе.
З.Ы. Как говорят граждене подонки — THESERG жжот.
WH>Во-во... boost::lambda это какраз то самое что попало...
Предложите что-то более удобное. Что-то, что сократит время на разработку. Писать каждый раз по функтору — ну уж нет, индейская хижина, код становится жутким.
Впрочем, еще расскажите о себе. О том, насколько хорошо вы знаете boost и как часто им пользовались. Тогда многое станет ясным
SD>Предложите что-то более удобное. Что-то, что сократит время на разработку. Писать каждый раз по функтору — ну уж нет, индейская хижина, код становится жутким.
А зачем каждый раз по функтору? Заменять каждый цикл for на for_each? Как правило, функторы приходится писАть не так уж и часто.
J>Никак. Время сборки — не ресурс, если у тебя не в одном файле весь проект, конечно же. J>Уж чем-чем, а временем сборки за удобство можно заплатить, а грамотная модульность уменьшает время сборки в разы.
Ну уж нет. Не согласен категорически. Время сборки — очень даже ресурс. Почему-то его очень сильно недооценивают, но он способен самым кардинальным образом повлиять на скорость разработки — читай, на стоимость (по выбору — на качество) программного продукта. И грамотная модульность способна чуть улучшить ситуацию, но не кардинально.
Здравствуйте, SkyDance, Вы писали:
SD>Предложите что-то более удобное. Что-то, что сократит время на разработку. Писать каждый раз по функтору — ну уж нет, индейская хижина, код становится жутким.
Код становится жутким в любом случае.
Тут два варианта. Либо полноценные замыканяи и функции высшего порядка либо не использовать эти выверты вобще.
SD>Впрочем, еще расскажите о себе.
Модератор местного форума по С++.
Держусь в топе не смотря на то что пару лет там почти не появлялся. SD>О том, насколько хорошо вы знаете boost
Очень хорошо. Разве что я его не писал. Лень. SD>и как часто им пользовались.
Пару лет назад довольно часто.
Но после того как я сильно улучшил свое кунг-фу надобность в нем практически отпала.
Ну разве что intrusive_ptr, thread и boost::filesystem всееще иногда полезны. SD>Тогда многое станет ясным
И что тебе стало ясно?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
WH>Код становится жутким в любом случае. WH>Тут два варианта. Либо полноценные замыканяи и функции высшего порядка либо не использовать эти выверты вобще.
Выверты, хм? То есть "выполнить действие для тех членов контейнера, getState() которых возвращает ACTIVE" — выверт? Тогда моя практика включает немало "вывертов" (С)
WH>Модератор местного форума по С++. WH>Держусь в топе не смотря на то что пару лет там почти не появлялся.
Местный == RSDN?
WH>Но после того как я сильно улучшил свое кунг-фу надобность в нем практически отпала.
То есть вы просто написали свою версию? Или отказались от "вывертов" (С)? Или как теперь вы решаете задачи вида тех, что я привел выше? Меняете архитектуру классов? Расскажите, это действительно интересно.
WH>И что тебе стало ясно?
В первую очередь, что на брудершафт мы не пили. Во вторую, я так и не вижу разумных доводов против использования lambda.
Здравствуйте, SkyDance, Вы писали:
SD>Местный == RSDN?
Угу.
SD>То есть вы просто написали свою версию?
Нет. SD>Или отказались от "вывертов" (С)?
Они просто стали не нужны. SD>Или как теперь вы решаете задачи вида тех, что я привел выше?
Простым циклом.
Это действительно проще.
Если бы были полноценные замыкания то я бы еще подумал. А так... SD>Меняете архитектуру классов?
И архитектуру тоже меняю. SD>Расскажите, это действительно интересно.
Это на книгу потянет.
Слишком много всего.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
SD> Во вторую, я так и не вижу разумных доводов против использования lambda.
ИМХО: Архитектура современных компьютеров не подходит для функционального программирования. С++ считается low-level языком и особого смысла навешивать туда ФП я не вижу. Есть куча языков, к примеру Python, где ФП выглядит уместно.
Но это уже вопросы религии
SD>> Во вторую, я так и не вижу разумных доводов против использования lambda. S>ИМХО: Архитектура современных компьютеров не подходит для функционального программирования. С++ считается low-level языком и особого смысла навешивать туда ФП я не вижу. Есть куча языков, к примеру Python, где ФП выглядит уместно. S>Но это уже вопросы религии
ИМХО: Для функционального программирования не подходит не архитектура современных компьютеров. В конце концов, принципы ООП тоже "не родные" для железа (инкапсуляция, наследование, полиморфизм — где тут хоть что-то близкое к ассемблеру?). Для функционального программирования не подходит архитектура современного программиста и современного преподавателя института . Мы только-только "протащили" в массы ООП, а его принципы (имхо!) проще чем принципы функционального программирования.
M>То есть такой трюк с обычными классами не проходит , а только с некими пимплами ? Ну чесно говоря для пимплов я конструктор копирования напишу в строчку и безопасно с точки зрения исключений. Действительно , лишь скопировать указатель.
Такой трюк прокатывает с любыми классами, лишь бы они заранее проектировались с учётом небросающего swap. В конце концов, в итоге все классы состоят из байтов, а обмен байтами — небросающая исключений операция. Скажем так — проблемы с такой техникой возникают только для сложных классов из сторонних библиотек, которые не предусматривают небросающих swap-ов. В таком случае эти классы действительно приходится хранить отдельно от класса, а в классе — лишь указатель на них.
M>Поясните как я побитово поменяю мембера , некого CString ? а если класс завязан на указатели на себя или мемберов ?
Если класс завязан на указатели на себя — то прийдётся разделять указатель на класс и на его состояние. То бишь, в классе — указатель на состояние, а отдаются наружу указатели на весь класс. Тогда swap состояния ничего не порушит. Согласен, что это сложнее чем просто указатели на себя, но в большинстве случаев игра стоит свеч.
Здравствуйте, SkyDance, Вы писали:
SD>Впрочем, еще расскажите о себе. О том, насколько хорошо вы знаете boost и как часто им пользовались. Тогда многое станет ясным
Мне очень нравится использовать boost при истользование std::find_if. Комментарии не нужны!
Здравствуйте, Left2, Вы писали:
L>Ну уж нет. Не согласен категорически. Время сборки — очень даже ресурс.
Согласен. Когда стандартная линковка 10-15 минут...
Здравствуйте, jazzer, Вы писали:
J>Никак. Время сборки — не ресурс, если у тебя не в одном файле весь проект, конечно же.
Если это занимает весь день — то ресурс.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, LuciferMoscow, Вы писали:
L>>Ну уж нет. Не согласен категорически. Время сборки — очень даже ресурс. LM>Согласен. Когда стандартная линковка 10-15 минут...
Счастливый ты. А вот когда полчаса и более — этот ресурс начинаешь чувствовать физически.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
L>>>Ну уж нет. Не согласен категорически. Время сборки — очень даже ресурс. LM>>Согласен. Когда стандартная линковка 10-15 минут...
AJD>Счастливый ты. А вот когда полчаса и более — этот ресурс начинаешь чувствовать физически.
Ага... а полный билд ACE/TAO — на рабочей машине это фактически весь рабочий день. Двухпроцессорный Xeon с 2 гигами памяти справляется часа за 4. Правда, примерно половина из этого времени — запуск тестов...
Здравствуйте, SkyDance, Вы писали:
SD> Что-то, что сократит время на разработку. Писать каждый раз по функтору — ну уж нет, индейская хижина, код становится жутким.
ИМХО, гораздо важнее чтобы код легко читался, а не только легко писался. А с лямдой код действительно становится короче, но ясность, имхо, совсем не улучшается.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, Left2, Вы писали:
L>ИМХО: Для функционального программирования не подходит не архитектура современных компьютеров. В конце концов, принципы ООП тоже "не родные" для железа (инкапсуляция, наследование, полиморфизм — где тут хоть что-то близкое к ассемблеру?). Для функционального программирования не подходит архитектура современного программиста и современного преподавателя института . Мы только-только "протащили" в массы ООП, а его принципы (имхо!) проще чем принципы функционального программирования.
Само по себе ФП не слишком сложно... Сложно именно перестроиться... Это просто ортогональный способ мыщления по сравинению с привычным... Но уж если его освоил, то можешь работать в плоскости, а не на оси...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, jazzer, Вы писали:
J>>Никак. Время сборки — не ресурс, если у тебя не в одном файле весь проект, конечно же. AJD>Если это занимает весь день — то ресурс.
ну, значит, у тебя весь проект в одном файле и модульность его нулевая, с чем я тебя и поздравляю.
Здравствуйте, Left2, Вы писали:
J>>Никак. Время сборки — не ресурс, если у тебя не в одном файле весь проект, конечно же. J>>Уж чем-чем, а временем сборки за удобство можно заплатить, а грамотная модульность уменьшает время сборки в разы.
L>Ну уж нет. Не согласен категорически. Время сборки — очень даже ресурс. Почему-то его очень сильно недооценивают, но он способен самым кардинальным образом повлиять на скорость разработки — читай, на стоимость (по выбору — на качество) программного продукта. И грамотная модульность способна чуть улучшить ситуацию, но не кардинально.
Как раз кардинально.
Просто разбей свою прогу на библиотеки, лучше — на динамически загружаемые — и будет тебе счастье.
И в любом случае, то, что ты в одном файле (сишном, естественно, не в хедере) заюзал лямбду, а в нем лямбды до этого не было, на времени сборки проекта практически не отразится, а пересобирать весь проект целиком, при грамотном разбиении его на модули, приходится крайне редко.
L>>Ну уж нет. Не согласен категорически. Время сборки — очень даже ресурс. Почему-то его очень сильно недооценивают, но он способен самым кардинальным образом повлиять на скорость разработки — читай, на стоимость (по выбору — на качество) программного продукта. И грамотная модульность способна чуть улучшить ситуацию, но не кардинально.
J>Как раз кардинально. J>Просто разбей свою прогу на библиотеки, лучше — на динамически загружаемые — и будет тебе счастье.
Чёрт с ним, возможно я не слишком грамотно бью свои проекты на модули. Но возьмём тот же TAO — он вроде бы неплохо разбит на динамические библиотеки. И что? Всё равно билд идёт часами даже на самых быстрых серверах. Опять же — даже при самом грамотном разбиении на модули будут куски, на которые завязана большАя часть проекта, изменения в которых неминуемо влекут за собой практически полный перебилд (в случае TAO — это хотя бы компилятор TAO_IDL). Да и интерфейсы между модулями хоть и меняются куда реже чем сами модули, но тоже не статичны — частенько приходится менять и их. Ну и не забываем что время от времени полный перебилд делать всё равно приходится (особенно если проект кросплатформенный и/или имеет несколько разных вариантов билда, а таких проектов сейчас имхо большинство).
J>И в любом случае, то, что ты в одном файле (сишном, естественно, не в хедере) заюзал лямбду, а в нем лямбды до этого не было, на времени сборки проекта практически не отразится, а пересобирать весь проект целиком, при грамотном разбиении его на модули, приходится крайне редко.
А смысл мне её использовать в одном файле? Если уж юзать лямбду — то хотя бы в бОльшей части файлов. То бишь, широко А тащить к себе библиотеку ради экономии десятка строчек кода в единственном месте программы — ну какой в этом смысл? Но как только я её начинаю широко юзать — тут же время билда увеличивается на порядок.
Здравствуйте, AndrewJD, Вы писали:
AJD>Здравствуйте, jazzer, Вы писали:
J>>ну, значит, у тебя весь проект в одном файле и модульность его нулевая, с чем я тебя и поздравляю.
AJD>Это значит что у меня в солюшене ~250 проектов, модульность нормальная и код в хеадарах не пишем
тогда не очень понятно, если все так хорошо разбито, почему сборка идет долго.
По идее, в основном ребилд должен происходить в одном только проекте в 95% случаев.
Хотя, конечно, сложно судить, не видя, что там и как.
Здравствуйте, Left2, Вы писали:
L>Ну и не забываем что время от времени полный перебилд делать всё равно приходится (особенно если проект кросплатформенный и/или имеет несколько разных вариантов билда, а таких проектов сейчас имхо большинство).
В таких случаях полный ребилд имеет смысл ставить на вечер, чтоб ночью собрался, отыграли автоматические тесты, и с утра был виден статус проекта.
J>>И в любом случае, то, что ты в одном файле (сишном, естественно, не в хедере) заюзал лямбду, а в нем лямбды до этого не было, на времени сборки проекта практически не отразится, а пересобирать весь проект целиком, при грамотном разбиении его на модули, приходится крайне редко. L>А смысл мне её использовать в одном файле? Если уж юзать лямбду — то хотя бы в бОльшей части файлов. То бишь, широко А тащить к себе библиотеку ради экономии десятка строчек кода в единственном месте программы — ну какой в этом смысл? Но как только я её начинаю широко юзать — тут же время билда увеличивается на порядок.
Ну не знаю. У меня до лямбды руки не доходили, ограничивался boost::bind, особой разницы не заметил.
И, опять же, вряд ли ты далешь массированные изменения кода без промежуточной компиляции, так?
Стало быть, в большинстве случаев приходится пересобирать только один файл.
J>В таких случаях полный ребилд имеет смысл ставить на вечер, чтоб ночью собрался, отыграли автоматические тесты, и с утра был виден статус проекта.
Да, конечно — именно так и делалось. Но в итоге получается что ты можешь сделать 5 полных ребилдов в рабочую неделю. Самый что ни на есть ресурс.
J>И, опять же, вряд ли ты далешь массированные изменения кода без промежуточной компиляции, так? J>Стало быть, в большинстве случаев приходится пересобирать только один файл.
Вот тут я честно говоря не понял как одно следует из другого. Если я делаю массивные изменения кода — то мне прийдётся, скорее всего, пересобрать даже не один раз — далеко не все ошибки вылезут при первой же компиляции. Как ни крути но не вижу я реальных возможностей что-то активно менять в большом проекте без массивных перекомпиляций. Мелкие фиксы, локализованные в одном модуле — да, можно. Вот только далеко не все фиксы мелкие.
Здравствуйте, jazzer, Вы писали:
J>тогда не очень понятно, если все так хорошо разбито, почему сборка идет долго. J>По идее, в основном ребилд должен происходить в одном только проекте в 95% случаев.
Обычно это так. Но иногда меняются базовые библиотеки на которые все завязано.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
AJD>Обычно это так. Но иногда меняются базовые библиотеки на которые все завязано.
Но согласитесь, изменение базовых библиотек — отнюдь не рядовая операция? Можно и подождать некоторое время.
Кроме того, существуют precompiled headers, интеллектуальные и распределённые системы сборки.
Здравствуйте, assad, Вы писали:
A>Анатоликс, не хочу вас расстраивать, но в конструкторе копирования квалификатор const вовсе не обязателен. A>см 12.8. A>п.2 A>стандарта си ++
Остается страх только перед тем что компилятор может не прорюхать и сгенерировать конструктор копирования с const. Поэтому лучше не рисковать и поместить KK с const в private секцию
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
1) за то что вступаешь с кандидатом в полемику, что говорит о том, что человеку явно нечем заняться на рабочем месте;
2) раскрываешь копоративные секреты, ибо насколько я понимаю здарвый смысл темы собеседования являются корпоративной тайной.
Здравствуйте, assad, Вы писали:
A>Анатоликс, не хочу вас расстраивать, но в конструкторе копирования квалификатор const вовсе не обязателен. A>см 12.8. A>п.2 A>стандарта си ++
А я где-то утверждал обратное?
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте, 0x8000FFFF, Вы писали:
FFF>А я бы тебя выгнал, за
FFF>1) за то что вступаешь с кандидатом в полемику, что говорит о том, что человеку явно нечем заняться на рабочем месте;
Это можно сказать про каждого, более менее активного, RSDN-овца
Выгоните меня! А то уже задолбало по этой <... краткое описание пустыни ...> шататься.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, CString, Вы писали:
CS>Здравствуйте, Hottabych1, Вы писали:
CS>Привет, ты не один такой. CS>Я когдато вышел на улицу после собеседования, и у меня реально были мысли что я не просто ничего не знаю, CS>что программирование это вобще не мое, что я не в той области работаю ))). Правда через 5-10 минут, реакция преобразовалась в следующюю: "Это я ничего не знаю?, я вам еще покажу! )))" CS>На след день поехал закупаться книгами (потому что пишу я на Perl, но нечитал не одной книги по нему). CS>И ушел сголовой в чтение, оказывается так много нового.
CS>А насчет констрктора копирования, ну слажал немного. CS>хотя я сам так не любил эти вопросы по синтаксису, бе ))))
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, Hottabych1, Вы писали:
J>>>А если человек демонстрирует непонимание константности в С++ — о чем тут еще говорить...
H>>Ну и что? Проходит 10 секунд, которые уходят на сверку со справочником и вот уже человек понимает константность. Это что, такая офигенно сложная штука?
КД>Помню, в детстве залез на сайт C++ гуру. И уполз оттуда после не сумев понять смысл ниже представленных конструкций: КД>