Таким образом, для этого вам нужно будет использовать count (), чтобы получить количество раз, когда конечный узел достигнут (количество различных путей к этому узлу), затем выполнить фильтрацию на основе этого количества:
[110 ]Эта техника очень распространена и известна как шаблон разработки: Приобретение ресурса является инициализацией (RAII).
Я не смущался бы использовать этот шаблон разработки вообще.
Намного лучше, что Вы кодируете использование этого шаблона разработки, потому что Вы избежите ошибок, забывая сбрасывать курсор, или независимо от того, что рассматриваемый ресурс.
Если Вы обеспокоены, что другие программисты не могли бы понять это, то те программисты должны быть более образованы. Всегда стремитесь кодировать самым безошибочным способом, где Вы лишаете возможности Вас и других стрелять себе в ногу.
"Некоторый инструмент статического анализа мог предложить, чтобы они были удалены?"
Причина состоит в том, потому что объект создается, и конструктор/деструктор названы. Таким образом, это не неиспользуемая переменная.
Как другие сказали, это - хороший стиль C++. Для помощи удобочитаемости я всегда снабжаю префиксом такие RAII-единственные классы Scoped
(например, ScopedBusyCursor
) прояснить от взгляда, какова цель класса.
Это известная и хорошая идиома C++, как другие ответила.
Чтобы прояснить, что классы предназначены, чтобы только использоваться в объеме а не быть перемещенными между различными объемами, могло бы быть хорошо сделать их noncopyable. Это может быть сделано вручную путем добавления нереализованного частного конструктора копии и оператора присваивания копии. Короче и больше читаемого пути должен получить класс из повышения:: noncopyable:
#include <boost/noncopyable.hpp>
class BusyCursor : public boost::noncopyable // for scoped use only
{
// ...
};
Это - хорошая идиома и наиболее часто используемый.
Лучше, чем какая-либо альтернатива, например, даже если Ваш что-то трудоемкий код выдает исключение, ~BusyCursor
деструктор все еще назовут.
Я обычно называю это "защитой". По-моему, это демонстрирует одни из самых больших преимуществ C++ (детерминированная обработка ресурса). Это - одна из вещей, которые я пропускаю больше всего при работе на собравших "мусор" языках.
Никакой нормальный инструмент статического анализа не предложил бы удалить переменную, потому что она используется. Это имеет эффект, потому что его конструктора и деструктор вызывают. Необходимо быть совершенно в безопасности.
Другие уже упомянули, что это - классический RAII. То, что я добавлю, должно сказать, что это - одна из лучших вещей о C++. Очень немного других языков поддерживают его или по крайней мере поддерживают его правильно (даже конструкция использования C# не так хороша, как нагрузка находится все еще на клиентском коде - см. мою запись в блоге на этом).
Этим становятся столь тесно связанным с C++, что необходимо быть уверены, что любой читающий его был бы знаком с ним - и если не они должны быть.
Возможно не использование этого шаблона является плохой идиомой. Когда Вы не используете RAII, Ваш код заканчивает тем, что был похож на это:
void func() {
Cursor oldCursor = CurrentCursor();
SetCursor(BUSY_CURSOR);
try {
do_slow_stuff();
SetCursor(oldCursor);
} catch (...) {
SetCursor(oldCursor);
throw;
}
}
Вы действительно думаете, имея это, сорил всюду по Вашему коду, лучше для обслуживания?
Можно также пойти с чем-то как ScopeGuard Andrei Alexandrescu и Petru Marginean. Ваш образец выглядел бы примерно так затем:
void DoSlowThing
{
Cursor oldCursor = CurrentCursor();
SetCursor(BUSY_CURSOR);
ON_BLOCK_EXIT(SetCursor, oldCursor);
... do something time-consuming ...
}
Это помогает сделать одноразовые операции RAII-типа, не имея необходимость создавать новый класс для каждого. Однако для Вашего примера Курсора, так как это - класс, который Вы будете, вероятно, много раз снова использовать, Вы, вероятно, более обеспечены со специализированным классом.