Здравствуйте, 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 — остался в старом). Для надежных систем может быть нужна. Слышал, что в том же Яндексе такое спрашивают.
Для надежных систем , я бы другие механизмы использовал.
Меня поражает другое, почему когда говорят об этом способе принимают само собой разумеещееся , что своп можно написать не кидающим исключение. Я в ветке все пытаюсь развить диалог до этой мысли , но не получается.
И второе , я реально не видел примеров использования этой технике. Обязательно бы посмотрел, но есть подозрение , что тоже самое можно сделать проще и красивше.