Руководство, когда явно включать / отключать копирование в классах C ++? - PullRequest
4 голосов
/ 23 июня 2011

Коллега убирает пару библиотек.При этом он читает дизайн API для C ++ , и в нем говорится о явном включении или отключении копирования в классах C ++.Это то же самое, что Саттер и Александреску говорят в своих C ++ Стандартах кодирования .

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

Любое руководство в ту или иную сторону?Спасибо!

Ответы [ 5 ]

6 голосов
/ 23 июня 2011

Это зависит от роли, которую классы играют в приложении. Если только класс представляет значение, где идентичность не имеет значения, вы должны Запрет копирования и назначения. Точно так же, если класс полиморфен. Как Вообще правило, если вы размещаете объекты типа класса динамически, это не должно быть копируемым. И наоборот, если класс копируемый, вы не должны размещать его экземпляры динамически. (Но Есть некоторые исключения, и это не редкость для динамического и старайтесь не копировать большие объекты, даже если семантика доказывает обратное.)

Если вы разрабатываете низкоуровневую библиотеку, выбор менее очевиден. Нечто подобное std::vector может играть много ролей в приложении; в в большинстве случаев копирование не подходит, но запрещение копирования сделать его непригодным в тех немногих, где это уместно.

5 голосов
/ 23 июня 2011

В отличие от DeadMG, я считаю, что большинство классов не подлежат копированию.

Вот что написал Страуструп в своей книге «Дизайн и эволюция C ++»:

«Я лично считаю к сожалению, что операции копирования определены по умолчанию, и я запрещаю копирование объектов многих моих классов»

5 голосов
/ 23 июня 2011

Классы, которые не подлежат копированию, должны быть исключением, а не правилом.Ваш класс должен быть недоступен для копирования тогда и только тогда, когда вы не можете сохранить семантику значений при копировании, например, именованные мьютексы, указатели уникального владения.Иначе, ваш класс должен быть копируемым.Многие библиотеки C ++ зависят от возможности копирования, особенно до C ++ 0x, где они не могут быть перемещены.

0 голосов
/ 23 июня 2011

Я искренне верю, что семантика копирования должна предоставляться автоматически или не предоставляться вовсе.

Однако, плохо написанные библиотеки могут иногда выиграть от конструктора копирования вручную.

Обратите внимание, что ситуация в C ++ сильно отличается (потому что семантика копирования обычно требуется для стандартной библиотеки!), Чем в C ++ 0x, где мой совет почти всегда применим.

0 голосов
/ 23 июня 2011

Я думаю, вы должны попытаться написать как можно меньше кода, чтобы класс делал то, что он должен делать.Если никто не пытается скопировать класс и он не будет скопирован в ближайшем будущем, не добавляйте такие вещи, как конструктор копирования или оператор присваивания.Просто сделайте класс не копируемым.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...