Какие варианты использования для booster :: noncopyable? - PullRequest
2 голосов
/ 19 августа 2010

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

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

Ответы [ 2 ]

4 голосов
/ 20 августа 2010

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

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

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

например

class MyClass : boost::noncopyable
{ 
   ...
};
3 голосов
/ 19 августа 2010

В случае boost правильным является boost::noncopyable.

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

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

...