У меня есть класс
class MyClass
{
public :
int a;
int b;
}
Для использования идиомы copy-swap я создаю функцию
void MyClass::swap(MyClass& other)
{
std::swap(a,other.a);
std::swap(b,other.b);
}
Если позже я изменю свой класс и удалю участника a
, то компилятор будет жаловаться в swap
функция, и это нормально.
Но если я добавлять новый член мой swap
функция больше не правильная. Что я могу сделать, чтобы не забыть добавить нового члена в функцию подкачки?
Проблема в том, что ваш ответ не является копией и подстановкой. Фактическая идиома копирования и обмена заключается в написании конструктора копирования и перемещении операций для класса. Последний даст вам эффективную операцию свопинга через std :: swap. Затем вы пишете свое назначение копирования, вызывая конструктор копирования вашего класса для создания локальной копии. Затем поменяйте местами это с временным. Вы не делаете это член за членом.
Лучший способ не забыть — просто не писать какие-либо специальные функции-члены и попросить компилятор сгенерировать их для вас. Это называется правилом нуля. Большинству классов не нужно писать эти методы, а просто выбирать элементы (или писать) так, чтобы сгенерированные были правильными. Одной из причин является отсутствие дополнительного обслуживания при добавлении участника.
Наконец, если вы пишете класс управления ресурсами и пишете эти функции вручную, вам не обязательно использовать копирование и обмен. Копирование и обмен в основном обменивают производительность для безопасности исключительной ситуации. Я почти никогда не использовал строгую безопасность исключений, и во многих областях просто не практично так писать. Так что используйте его только в случае необходимости.
Других решений пока нет …