Каковы варианты использования для booster::noncopyable?

Первое: это boost::noncopyable или booster::noncopyable. Я видел как в разных местах.

Почему кто-то хочет сделать класс не копируемым? Можете ли вы привести несколько примеров использования?

2 ответа

Решение

Я считаю это полезным всякий раз, когда у вас есть класс, у которого есть указатель в качестве переменной-члена, которой владеет этот класс (т.е. он отвечает за уничтожение). Если вы не используете shared_ptr<> или какой-либо другой умный указатель с подсчетом ссылок, вы не можете безопасно скопировать или назначить класс, потому что в деструкторе вы захотите delete указатель Однако вы не знаете, была ли взята копия класса, и, следовательно, вы получите либо двойное удаление, либо нарушение доступа при разыменовании освобожденного указателя.

Если вы наследуете от noncopyable тогда у него есть два преимущества:

  • Это предотвращает копирование или назначение класса
  • Это делает намерение ясным из рассмотрения определения класса, то есть самодокументируемого кода.

например

class MyClass : boost::noncopyable
{ 
   ...
};

Правильный в случае boost является boost::noncopyable,

Он используется для предотвращения копирования объектов, как говорит название. Это имеет смысл, когда копирование приводит к очень сложной ситуации. Примером является класс, заключающий в себе концепцию дескриптора файла или сетевого подключения, как указано в документации. Проблемы возникают с освобождением / закрытием ресурса или файла. Если у вас много их копий, как бы вы справились? Вы могли бы использовать подсчет ссылок, но это трудно сделать правильно, если вы разворачиваете ручки в некоторых местах...

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

Другие вопросы по тегам