Re[10]: Как я завалил собеседование
От: Андрей Хропов Россия  
Дата: 22.01.07 12:51
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Понял , то есть вы хотите и дельше использовать объект в старом состоянии, если вы его не смогли изменить. Часто вам такая возможность нужна ?


Это что-то вроде мини-транзакционности (то есть либо Commit — объект в новом состоянии, либо Rollback — остался в старом). Для надежных систем может быть нужна. Слышал, что в том же Яндексе такое спрашивают.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[14]: Как я завалил собеседование
От: Андрей Хропов Россия  
Дата: 22.01.07 12:51
Оценка: -1
Здравствуйте, minorlogic, Вы писали:

M>Я понимаю , но какое именно метафизическое свойство нам гарантирует что своп не выкинет исключения ? У кого считается ? Какой механизм нам позволит делать своп для произвольных мемберов ?


swap просто побитно обменивает содержимое объектов, какие тут исключения. Это корректно, если в этот момент эти объекты залочены (т.е. нельзя будет из другого потока обратиться к наполовину сменившим состояние объектам).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Как я завалил собеседование
От: Андрей Хропов Россия  
Дата: 22.01.07 12:51
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Реально полезной привычкой, при определении плюсового класса, является немедленное помещение конструктора и операратора копирования в 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
{
...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Как я завалил собеседование
От: Андрей Хропов Россия  
Дата: 22.01.07 12:51
Оценка:
Здравствуйте, Kemsky, Вы писали:

K>Работая на настоящей работе можно за 5 лет не написать ни одного конструктора копирования,

+-1. Это все-таки довольно распространенная вещь.

K> ни одного const метода,

-1. Это очень желательно применять как можно чаще.

K> не описать ни одного указателя на функцию, тем более метод класса.

+1

K> Но экзаменатор, если не всю муть, то уж добрую половину точно припомнит.

Если экзаменатор вменяемый для него незнание синтаксиса указателей на метод класса не будет решающим аргументом.

K> Так что перед сменой работы Страуструпа читать от корки до корки однозначно.

Или перейти на C#/Java .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[15]: Как я завалил собеседование
От: i-maverick Россия  
Дата: 22.01.07 12:51
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

this->>>>>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов.

--->>>> Считается, что swap не кидает исключений. <-----

IM>>По-моему, вы все напутали, и правильный оператор копирования реализуется немного не так. Нужно использовать не swap самого объекта, а по очереди swap каждого члена класса. А соответственно каждый член класса должен тоже иметь exception-safe конструктор копирования и оператор копирования.


КД>Вообще говоря, вы бы лучше маленький пример "правильного оператора копирования" привели... А то мне кажется что вы просто пытаетесь придавить меня интеллектом


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

class Safe
{
  Object obj; // Object должен иметь безопасные конструктор копирования и оператор копирования
  std::string str;

public:
  Safe(const Safe& rhs) : obj(rhs.obj), str(rhs.str) {}
  Safe& operator= (const Safe& rhs)
  {
    Safe tmp(rhs);
    std::swap(obj, tmp.obj);
    std::swap(str, tmp.str);
    return *this;
  }
};
Re[16]: Как я завалил собеседование
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 22.01.07 12:59
Оценка:
Здравствуйте, i-maverick, Вы писали:

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


class Safe
{
 //...
}


А теперь, предположим, нужно предоставить просто метод для обмена состояний объектов или специализацию std::swap ... получается что выделенный, собственный Safe::swap не такая уж бесполезная вещь
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[16]: Как я завалил собеседование
От: superman  
Дата: 22.01.07 13:05
Оценка:
Здравствуйте, i-maverick, Вы писали:

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


IM>
IM>class Safe
IM>{
IM>  Object obj; // Object должен иметь безопасные конструктор копирования и оператор копирования
IM>  std::string str;

IM>public:
IM>  Safe(const Safe& rhs) : obj(rhs.obj), str(rhs.str) {}
IM>  Safe& operator= (const Safe& rhs)
IM>  {
IM>    Safe tmp(rhs);
IM>    std::swap(obj, tmp.obj);
IM>    std::swap(str, tmp.str);
IM>    return *this;
IM>  }
IM>};
IM>



Вы ОДНОЗНАЧНО говорите о разных вещах
Re[17]: Как я завалил собеседование
От: i-maverick Россия  
Дата: 22.01.07 13:05
Оценка: -1
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>А теперь, предположим, нужно предоставить просто метод для обмена состояний объектов или специализацию std::swap ... получается что выделенный, собственный Safe::swap не такая уж бесполезная вещь


А вот отсюда и пошло непонимание. Вы просто сказали, что есть некий Safe::swap метод, который по определению не кидает исключений. А про то, как вы его планируете реализовывать, скромно умалчиваете.
Re[15]: Как я завалил собеседование
От: minorlogic Украина  
Дата: 22.01.07 13:06
Оценка:
Здравствуйте, Андрей Хропов, Вы писали:

АХ>Здравствуйте, minorlogic, Вы писали:


M>>Я понимаю , но какое именно метафизическое свойство нам гарантирует что своп не выкинет исключения ? У кого считается ? Какой механизм нам позволит делать своп для произвольных мемберов ?


АХ>swap просто побитно обменивает содержимое объектов, какие тут исключения. Это корректно, если в этот момент эти объекты залочены (т.е. нельзя будет из другого потока обратиться к наполовину сменившим состояние объектам).



Поясните как я побитово поменяю мембера , некого CString ? а если класс завязан на указатели на себя или мемберов ?
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[15]: Как я завалил собеседование
От: minorlogic Украина  
Дата: 22.01.07 13:08
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

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


this->>>>>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов.


--->>>> Считается, что swap не кидает исключений. <-----


M>>>>Ок. А если половина объекта просвопируется а половина нет ? Выброс исключения , и в чем преимущество.


M>>Я понимаю , но какое именно метафизическое свойство нам гарантирует что своп не выкинет исключения ? У кого считается ? Какой механизм нам позволит делать своп для произвольных мемберов ?


КД>Выносишь состояние объекта в отдельный класс, объекты которого создаются динамически (в куче).


КД>swap состояний сведется к обмену указателей на них


То есть такой трюк с обычными классами не проходит , а только с некими пимплами ? Ну чесно говоря для пимплов я конструктор копирования напишу в строчку и безопасно с точки зрения исключений. Действительно , лишь скопировать указатель.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[18]: Как я завалил собеседование
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 22.01.07 13:08
Оценка:
Здравствуйте, i-maverick, Вы писали:

КД>>А теперь, предположим, нужно предоставить просто метод для обмена состояний объектов или специализацию std::swap ... получается что выделенный, собственный Safe::swap не такая уж бесполезная вещь


IM>А вот отсюда и пошло непонимание. Вы просто сказали, что есть некий Safe::swap метод, который по определению не кидает исключений. А про то, как вы его планируете реализовывать, скромно умалчиваете.


this->swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов. Считается, что swap не кидает исключений.

-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[18]: Как я завалил собеседование
От: superman  
Дата: 22.01.07 13:09
Оценка:
Здравствуйте, i-maverick, Вы писали:


IM>А вот отсюда и пошло непонимание. Вы просто сказали, что есть некий Safe::swap метод, который по определению не кидает исключений. А про то, как вы его планируете реализовывать, скромно умалчиваете.


ага вот например здесь
Автор: Коваленко Дмитрий
Дата: 22.01.07
умалчивает
Re: Как я завалил собеседование
От: ggg  
Дата: 22.01.07 13:12
Оценка:
Здравствуйте, Hottabych1, Вы писали:

H>В пятницу был в одной очень солидной фирме. Когда шел — меня предупреждали, что собеседование длится по несколько часов. Однако я умудрился его завалить за 10 минут . Как? Очень просто — нервы + забыл элементарную вещь.

Не нужно нервничать перед собеседованием. Вы ж не студент перед экзаменом все-таки.

H>Написал дрожащими руками вот такое:

Да зачем дрожащие руки-то? Это что, первое собеседование в жизни, ведь нет же! Имхо, после 5 собеседований уже никогда не будешь волноваться и нервничать.

H>Конечно же, виноват и все такое. Но разве так уж важно, что я не могу с ходу написать конструктор копирования? Ведь достаточно потратить 30 сек времени, чтобы узнать, как это записывается. Ведь умение-неумение записать ту или иную конструкцию на языке программирования еще не говорит о том, что я не умею программировать, не умею решать задачи. Потому что синтаксические правила языка узнаются за ничтожное время и, на мой взгляд, гораздо важнее посмотреть, как соискатель будет вести себя при решении каких-либо необычных задач, как у него работает именно мозг, а не память. Каково ваше мнение?

Лично мне не хотелось бы работать в команде с человеком, который ошибается в простых вещах. Даже если он мега-эксперт в каких-то там нестандартных задачах. Но это опять же верно не для всех команд/не для всех работодателей (а вдруг у кого выбора иного нет).

Не расстраивайтесь, полистайте Мейерса хотя бы (даже если в текущей работе вам все это не нужно). Эти книжки попроще, чем Страуструп. А то Страуструпа читают-то многие, да вот понимают/запоминают процентов 30.
И помните, что неудачным собеседованием жизнь не заканчивается.
Re[11]: Как я завалил собеседование
От: minorlogic Украина  
Дата: 22.01.07 13:13
Оценка:
Здравствуйте, AndrewJD, Вы писали:

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


M>>Очень здравая мысль. Я считаю что такие весчи необходимо делать только в очень маленьком к-ве случаев , например смартпоинтер.

M>>Для тривиальных , небиблиотечных классов — это дурной тон.

AJD>Аргументы?


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

Обычно же я наблюдаю совершенно мерзкое использование перегрузки. Для ручного управления ресурсами и т.п. Хотя конечно это делается надежнее с помощью отдельных спецефичных сущностей , смартпоинтеры и т.п.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[9]: Как я завалил собеседование
От: ggg  
Дата: 22.01.07 13:15
Оценка:
K>>А вообще, кто знает универсальную и абсолютно точную методологию выявляения класса (2), пусть первым кинет в меня камнем.

АХ>Посмотреть резюме с указанием предыдущих мест работы ?


У меня стойкое ощущение, что Вы еще слишком молоды
Re[16]: Как я завалил собеседование
От: superman  
Дата: 22.01.07 13:16
Оценка:
Здравствуйте, minorlogic, Вы писали:


КД>>Выносишь состояние объекта в отдельный класс, объекты которого создаются динамически (в куче).


КД>>swap состояний сведется к обмену указателей на них


M>То есть такой трюк с обычными классами не проходит , а только с некими пимплами ?

Это скорее следствие использования этих самых пимплов.

M>Ну чесно говоря для пимплов я конструктор копирования напишу в строчку и безопасно с точки зрения исключений. Действительно , лишь скопировать указатель.

-1. вот кстати конструктор копирования какраз таки в приведённой схеме может, и пожалуй должен выполнять глубокое копирование имплов, и может при этом генераровать искоючения..
Re[19]: Как я завалил собеседование
От: i-maverick Россия  
Дата: 22.01.07 13:17
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>

this->>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов. Считается, что swap не кидает исключений.


Я же говорю, что мы говорим об одном и том же.
Просто в исходном сообщении эта строка у меня отобразилась как цитата, и я ее не заметил.
Re[8]: Как я завалил собеседование
От: dr.Chaos Россия Украшения HandMade
Дата: 22.01.07 13:30
Оценка:
Здравствуйте, fGordon, Вы писали:

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


КД>>К тому, что при профессиональном программировании на C++ такое не допустимо.


G>Какое недопустимо?

G>Объясните, что мне инкриминируется то?

G>Пример из жизни:

G>Есть класс, который делает чтото. Я не пишу конструктор копии. Он создается "атовматом". Ок, с этим все понятно.
G>По мере написания программы, мне захотелось использовать конструктор копии (КК) для этого класса. Я пишу его "в ручную" и делаю в нем какие то дополнительные фичи, необходимые мне и которые КК конечно же не сделает для меня сам, ибо он не умеет читать мысли
G>А допольнительные операции в КК приходится делать в 99% случаев, ибо это жизнь, а не теория.

G>Так где я чтото делаю "не профессионально"?


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

Т.е. либо есть возможность копировать и она работает, либо копировать нельзя. Промежуточные состояния приводят к трате чужих нервов(своих?), особенно если глюк не проявился в отладке, но релиз убил.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[9]: Как я завалил собеседование
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 22.01.07 13:31
Оценка:
Здравствуйте, Андрей Хропов, Вы писали:

АХ>Ну (1) сразу отсеивается. (3) можно отсеять следующим образом: попросите его предолжить решение небольшой проблемы и аргументировать почему надо действовать так а не иначе. Какой паттерн лучше применить, заставьте его рассуждать. Ну и естественно надо дать задание на написание кода (на компьютере с MSDN/man/Internet), вплоть до банальщины — деревья, сортировки, строки. По стилю уже многое ясно (проверки на ошибки, внятность наименования переменных, хотя бы).


Таким образом с (3) можно отсеять и многих (2). Часто такие "творческие" задачи могут быть элементарыми для одного, но совершенно неочевидными для другого — интуиция штука капризная.

K>>А вообще, кто знает универсальную и абсолютно точную методологию выявляения класса (2), пусть первым кинет в меня камнем.


АХ>Посмотреть резюме с указанием предыдущих мест работы ?


Не всегда работает — может, человек пришёл устраиваться в первый раз.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Как я завалил собеседование
От: minorlogic Украина  
Дата: 22.01.07 13:35
Оценка:
Здравствуйте, Андрей Хропов, Вы писали:

АХ>Здравствуйте, minorlogic, Вы писали:


M>>Понял , то есть вы хотите и дельше использовать объект в старом состоянии, если вы его не смогли изменить. Часто вам такая возможность нужна ?


АХ>Это что-то вроде мини-транзакционности (то есть либо Commit — объект в новом состоянии, либо Rollback — остался в старом). Для надежных систем может быть нужна. Слышал, что в том же Яндексе такое спрашивают.


Для надежных систем , я бы другие механизмы использовал.

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

И второе , я реально не видел примеров использования этой технике. Обязательно бы посмотрел, но есть подозрение , что тоже самое можно сделать проще и красивше.
Ищу работу, 3D, SLAM, computer graphics/vision.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.