2013-05-30 3 views
1

Ниже кода найдены в WebKit:Почему использовать один инкрементора класс

RefPtr<Element> element = pendingScript.releaseElementAndClear(); 
if (ScriptElement* scriptElement = toScriptElement(element.get())) { 
    NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); 
    IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrementer(m_document); 
    //Do something else... 
    } 
} 

NestingLevelIncrementer простой класс, который увеличивает счетчик в строительстве и уменьшить его в разрушении. Вы можете проверить реализацию here.

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

Любые другие причины использования этого шаблона?

+0

Походит динамического связывания для меня. – leppie

+2

Стандартизация и четкость: используйте один и тот же стиль философии/программирования во всем коде, даже если он может быть чрезмерным в некоторых местах. Это облегчает жизнь вашим коллегам-программистам. –

+0

Использование такого класса позволяет при необходимости изменить поведение. Например, добавьте дополнительные инструкции в конструктор/деструктор для дальнейших версий. – ibi0tux

ответ

2

Цель заключается в том, чтобы приращение было отменено независимо от того, как завершается вывод something else; переменная стека будет уничтожена при возвращении метода или исключении.

Альтернативный подход на других языках будет использовать try...finally; увидеть это для более подробного обсуждения на RAII в C++ против прогноза наконец:

Does C++ support 'finally' blocks? (And what's this 'RAII' I keep hearing about?)

Смежные вопросы