«Класс-обертка» - это де-факто термин, означающий класс, «оборачивающий» ресурс;то есть, который управляет ресурсом.Когда люди пишут обертку, они делают что-то вроде этого:
class int_ptr_wrapper
{
public:
int_ptr_wrapper(int value = 0) :
mInt(new int(value))
{}
// note! needs copy-constructor and copy-assignment operator!
~int_ptr_wrapper()
{
delete mInt;
}
private:
int* mInt;
};
Этот класс управляет ("оборачивает") указателем на int
.Все ресурсы должны быть обернуты каким-либо образом для обеспечения чистоты (без явного кода очистки или шума) и правильности (деструктор гарантированно работает; не может забыть очистить и безопасен за исключением).
Этот шаблонназывается управлением ресурсами с привязкой к объему (SBRM), хотя гораздо более распространенным (но наиболее эзотерическим) именем является «Приобретение ресурсов» - «Инициализация» (RAII).Идея состоит в том, чтобы связать очистку ресурса с деструктором по причинам, указанным выше: область действия обрабатывает все остальное.
Обратите внимание, что я сказал, что в нем отсутствуют конструктор копирования и оператор назначения копирования.Это связано с правилом трех .(См. Связанный вопрос для подробного объяснения.) Самый простой способ правильно реализовать это правило - использовать идиому копирования и замены, объясненное здесь .
Иногда это не прагматичнонаписать класс-оболочку для очистки ресурса, обычно, когда ресурс уникален или используется один раз.(Или с транзакционным программированием.) Решение этой проблемы называется scope guard , способ написания кода очистки внутри функции, которая в этом нуждается.
Дополнительную информацию можно найти, выполнив поискдля этого в вашем любимом поисковом провайдере (то есть в Google) или переходите к «основному» документу здесь .Обратите внимание, что Boost предоставляет утилиту для этого, как это обычно делается для хороших идиом.