Как поменять местами два объекта без оператора копирования? - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть класс A, где оператор копирования присваивается.Как мне поменять местами два экземпляра A?

Я пытался использовать std::swap, но это не сработало.

class A {
private:
    int a;
public:
    A& operator=(const A& other) = delete;
    A(int _a = 0):a(_a){}
    void showA() { std::cout << a << std::endl; }
};

int main()
{
    A obj1(10);
    A obj2(20);
    obj1.showA();
    obj2.showA();
    //A temp;
    //temp = obj1;
    //obj1 = obj2;
    //obj2 = temp;
    obj1.showA();
    obj2.showA();
}

Я ожидаю, что obj1 и obj2 поменяются местами.Изначально obj1.a равно 10, а obj2.a равно 20, я ожидаю, что obj1.a будет 20 и obj2.a будет 10 после завершения.

1 Ответ

0 голосов
/ 10 февраля 2019

Как указал @Yksisarvinen, вам нужно иметь определенный конструктор перемещения и назначение перемещения, чтобы заставить std::move работать:

#include <iostream>
#include <utility> 

class A {
private:
    int a;
public:
    A(int a_) : a(a_) {}
    A(const A& other) = delete;
    A& operator=(const A&) = delete;
    A(A&& other) { 
        a = other.a;
    }
    A& operator=(A&& other) { 
        a = other.a;
        return *this;
    }
    void showA() { std::cout << a << std::endl; }
};

int main(int argc, char* argv[]) {
    A obj1(10);
    A obj2(20);
    obj1.showA();
    obj2.showA();

    std::swap(obj1, obj2);
    std::cout << "swapped:" << std::endl;
    obj1.showA();
    obj2.showA();
    return 0;
}
...