Что-то вы тут демагогию разводите. У вас и у гипотетических пользователей слово «антивирус» ассоциируется с совершенно разными программами — для пользователей они должны удалить все, что ему мешает и не позволять этому появиться снова, а в вашем понимании вы все довольно четко расписали в статьях. Я одного не пойму: зачем то, что вы описываете, называть антивирусом, еще больше заводя всех в заблуждение? Почему не взять собственное название для такого класса продуктов? Тогда и все эти бессмысленные дискуссии пропадут сами собой.
Ну, поставляется-то он вместе с блендером, но по умолчанию он выключен. В любом случае, вы же упомянули такие аддоны, как Import Images as Planes, Node Wrangler и Auto Tile Size, которые также входят в стандартную поставку блендера. Так чем же F2 хуже?
Да и на неслабых тоже. А еще иногда он вдруг решает отключить некоторые области из поиска и включать обратно не желает. Пример — стоит поиск в файлах и программах, может ни с того ни с сего взять, и перестать искать в программах. Через некоторое время возвращается.
Еще раньше любил всякие амазоны да гугл-драйвы, которого у меня нет, подключать после обновлений, а при попытке их убрать либо возвращал все обратно, либо вообще отрубал весь scope, в том числе локальные файлы. Но от этих причуд, к счастью, быстро отучился, тьфу-тьфу-тьфу.
Сразу после выхода 14.04 оно возвращалось (хотя если окно было распахнуто на весь экран, то кнопки все-равно были слева), но потом там что-то поломали и настройкам из компиза ему теперь по барабану.
Так согласно же событиям из Star Wars: Battlefront II после бунта клонов на Камино «чистокровными образцами» Джанго Фетта остались только парни из 501-го легиона Дарта Вейдера. Остальных стали делать из более разнообразного генетического материала, чтобы такого впредь не повторилось. Или Battlefront II уже не канон?
Был бы сам объект, так бы его и назвали объектом, а не «ручкой» (тут как раз подходит цитата Пушкина). А раз назвали, то для вас это — указатель. Даже если он «указывает» сам в себя (т.е. являться не указателем, а реальным объектом). Вот скажите, url-адрес это объект? А является ли он указателем? Чтобы прочитать статью на хабре, вам url нужен именно как указатель, и как указатель вы его и используете, не заботясь о том, что это объект, у которого можно посчитать длину, выяснить, по https вы пришли или http, и прочую, безусловно важную, но в данном случае, ненужную информацию.
Принцип инкапсуляции в данном случае скрывают от вас, как устроен указатель, но то что это указатель — вам говорят совершенно четко.
Когда играл еще только в демку Myst IV, в камине был дощечка, на которой квадраты переключались таким образом. Уж не помню, сколько времени потратил, но таки смог «перекрасить ее».
Ну, статьи конечно, немного не о том, что нужно, но реализацию обязательно посмотрю. Размер позволяет надеяться, что все будет понятно :). Пока статьи еще нет, что планируете осветить?
Кстати, в предыдущих статьях есть ссылки на репу на битбакете — я так понимаю, они безнадежно устарели? Аналогичных веток, упоминаемых в них, на гитхабе не нашел.
Мне кажется, что amarao намекал на принцип неопределённости Гейзенберга — невозможно одновременно точно измерить положение и импульс частицы. Раз мы точно знаем скорость и массу частицы, значит мы точно знаем её импульс и, соответственно, ничего не знаем о её положении :)
К сожалению, пример Kaleidoscope мало что проясняет. То есть, он конечно очень хорош и нужен, но уж слишком мало он охватывает. Браться реализовать что-либо серьезное после него совершенно невозможно. Например, он никак не показывает, как быть, если функция должна принимать не простые числа, а какие-то структуры данных. Причем хотелось бы эти структуры связать с API на C++, возможно, даже с шаблонными структурами.
Например, есть прекрасный проект генерации PEG-парсеров на JavaScript: PEG.js. У меня давно витает идея попробовать написать компилятор грамматики в машинный код с использованием LLVM. Но пока для меня это непосильная задача.
Вот бы написал кто такую статью, где был бы показан реальный пример хотя бы с парой сложных типов, а не простой числодробилки.
В примере кода, из статьи, который мы тут обсуждаем, нет никаких m_net1 и m_net2 — они появились в вашем примере, с неправильностью которого никто и не спорит. А то интересный у вас подход — сначала изменим код автора, а потом скажем, что он неправильный.
Еще раз мое возражение к вашему:
какой какашный код у конструктора класса LockNet. Что будет если new Network бросит исключение?
в том виде, как он в статье приведен, код нормальный и со своей целью — показать пример использования RAII — он отлично справляется.
Если new бросит исключение, до инициализации Network дело даже не дойдет, а LockNet останется не инициализированный и его деструктор вызываться не будет.
Если конструктор Network бросит исключение, то оба объекта, и Network, и LockNet, останутся неинициализированными и их деструкторы вызываться не будут. Память, выделенная new для Network, в этом случае будет утекать как в реализации LockNet, так и умного указателя. В этом смысле вы правы — выделение память нужно делать в своей RAII обертке. Но для иллюстрации RAII это совершенно необязательно.
И на ваше предложение добавить в него второй член я точно также говорю вам добавить второй управляемый объект в класс умного указателя. Или вы хотите сказать, что в этом случае проблем не будет? А если не хотите, то зачем вы приплели сюда усложненный пример (опять же, напомню):
class LockNet{
public:
LockNet(const Url &url){
m_net1 = new Network(url);
m_net2 = new Network(url);
}
~LockNet (){
delete m_net1;
delete m_net2;
}
private:
Network *m_net1;
Network *m_net2;
};
Если вас беспокоит, что в исходном примере не используются списки инициализации, так и что? Ну вылетит исключение в конструкторе LockNet, деструктор LockNet вызван не будет, и вызов delete над мусорным указателем m_net не произойдет, если вас это беспокоит.
В противном случае вы не сможете отделить мусор в значении указателей от реального указателя, когда будете делать delete в catch-блоке. Собственно, по большому счету, мой «наезд» заключался именно в этом.
Я что-то потерял вашу мысль… delete чего в каком catch?
А давайте теперь усложним ваш умный указатель и добавим в нем еще одно поле, чтобы он хранил два объекта. А теперь подумайте внимательней, что будет, если мы попрем общепринятые каноны и назовем этот ваш модифицированный указатель, ну, хотя бы, LockNet… Имена классов вообще ведь для человека придуманы, а чтобы пример не казался вам надуманным, давайте представим, что код пишет параноик и любитель острых ощущений, и специально именует все свои классы и переменные как можно более нелогичными именами.
Еще раньше любил всякие амазоны да гугл-драйвы, которого у меня нет, подключать после обновлений, а при попытке их убрать либо возвращал все обратно, либо вообще отрубал весь scope, в том числе локальные файлы. Но от этих причуд, к счастью, быстро отучился, тьфу-тьфу-тьфу.
Принцип инкапсуляции в данном случае скрывают от вас, как устроен указатель, но то что это указатель — вам говорят совершенно четко.
Да ладно? А что же это тогда? Число в системной таблице, указывающее на ресурс, не?
А вот с этим соглашусь — тоже сразу приходит в голову такая мысль.
Кстати, в предыдущих статьях есть ссылки на репу на битбакете — я так понимаю, они безнадежно устарели? Аналогичных веток, упоминаемых в них, на гитхабе не нашел.
Например, есть прекрасный проект генерации PEG-парсеров на JavaScript: PEG.js. У меня давно витает идея попробовать написать компилятор грамматики в машинный код с использованием LLVM. Но пока для меня это непосильная задача.
Вот бы написал кто такую статью, где был бы показан реальный пример хотя бы с парой сложных типов, а не простой числодробилки.
Зачем только автору понадобилось так уродовать букву «й», остаётся загадкой…
Еще раз мое возражение к вашему:
в том виде, как он в статье приведен, код нормальный и со своей целью — показать пример использования RAII — он отлично справляется.
Если new бросит исключение, до инициализации Network дело даже не дойдет, а LockNet останется не инициализированный и его деструктор вызываться не будет.
Если конструктор Network бросит исключение, то оба объекта, и Network, и LockNet, останутся неинициализированными и их деструкторы вызываться не будут. Память, выделенная new для Network, в этом случае будет утекать как в реализации LockNet, так и умного указателя. В этом смысле вы правы — выделение память нужно делать в своей RAII обертке. Но для иллюстрации RAII это совершенно необязательно.
В вашем примере вы предлагаете использовать умный указатель, который структурно выглядит так же, как исходный пример из статьи, напомню его здесь:
И на ваше предложение добавить в него второй член я точно также говорю вам добавить второй управляемый объект в класс умного указателя. Или вы хотите сказать, что в этом случае проблем не будет? А если не хотите, то зачем вы приплели сюда усложненный пример (опять же, напомню):
Если вас беспокоит, что в исходном примере не используются списки инициализации, так и что? Ну вылетит исключение в конструкторе LockNet, деструктор LockNet вызван не будет, и вызов delete над мусорным указателем m_net не произойдет, если вас это беспокоит.
Я что-то потерял вашу мысль… delete чего в каком catch?