Я пытаюсь реализовать конструктор копирования и оператор присваивания для класса. Я немного путаюсь с идиомой обмена копиями. Особенно, когда речь идет о конструкторе копирования. Является ли идентификатор обмена копиями каким-либо образом с конструктором копирования? Как избежать дублирования кода?Как реализовать конструктор копирования для id_om copy swap
Вот мой класс
Заголовок:
Class Actor
{
public:
Foo* foo;
Bar bar;
double member1;
bool member2;
unsigned int member3;
void Swap(Actor& first, Actor& second);
Actor(const Actor&);
Actor& operator=(const Actor);
}
Cpp:
void Actor::Swap(Actor& first, Actor& second)
{
// Swap wont work with my non pointer class
Bar temp = first.bar;
first.bar = second.bar;
second.bar = temp;
std::swap(first.foo, second.foo);
std::swap(first.member2, second.member2);
std::swap(first.member3, second.member3);
}
// What goes here? Is this a correct copy constructor? Does this have anything to do with a copy swap idiom? How can I avoid code duplication in my copy constructor?
Actor::Actor(const Actor& other)
{
foo = new Foo();
*foo = *other.foo;
bar = other.bar;
member1 = other.member1;
member2 = other.member2;
member3 = other.member3;
}
Actor& Actor::operator=(Actor other)
{
Swap(*this, other);
return *this;
}
Я после этого руководства: What is the copy-and-swap idiom?
Что такое 'Record :: Actor'? Ничего другого не квалифицирует «Запись ::' – StoryTeller
Это была опечатка. – marsh
Помимо объявления 'Swap' как нестатической функции-члена (вместо функции друга или, по крайней мере, статической функции-члена), идиома кажется примененной правильно. Вы написали копию и свопинг и получили бесплатное задание (обратите внимание, что он вызывает конструктор копирования неявно, получив свой аргумент по значению). Другой совет: называть его 'swap' вместо' Swap' и использовать 'using std :: swap; swap (x, y); 'вместо' std :: swap (x, y) 'включает ADL, что полезно для пользовательских типов. –