다른 클래스의 이동 생성자 내부에서 이동 클래스 (기본 생성자 없음)

수액

그래서 나는 삭제 된 복사 ctor / 할당이 있고 기본 ctor가없고 이동 ctor / 할당이있는 클래스가 있습니다.

class A {
  int data_ = 0;

public:
    A(const A& other) = delete;
    A& operator=(const A& other) = delete;

    A(int data) : data_(data) {}
    ~A() {}

    A(A&& other) { *this = std::move(other); }
    A& operator=(A&& other) {
        if (this != &other) {
            data_ = other.data_;
            other.data_ = 0;
        }
        return *this;
    }
};

그리고 A를 포함하는 클래스 B (기본 ctor도 없음)가 있습니다.

class B {
    A a;

public:
    B(const B& other) = delete;
    B& operator=(const B& other) = delete;

    B(int data) : a(data) {}
    ~B() {}

    B(B&& other) { *this = std::move(other); }
    B& operator=(B&& other) {
        if (this != &other) {
            a = std::move(other.a);
        }
        return *this;
    }
};

이제 문제는 B 이동 ctor가 A에 대한 기본 생성자가 없다고 말했기 때문에 컴파일되지 않는다는 것입니다. 이것은 정말 성가신 일입니다. B에서 이동 ctor를 호출 할 때 새 A 인스턴스를 만들고 싶지 않습니다. 이동!

그래서 내가 할 수있는 두 가지가 있습니다.

B(B&& other) : a(std::move(other.a)) { *this = std::move(other); }

이동 할당에서 A를 다시 이동하려고합니다. "this == & other == true"이면 A를 자신에서 이동하여 이제 A 쓰레기를 만듭니다.

또 다른 방법:

기본 개인 액터를 만듭니다. B를 A의 친구로 만드십시오.하지만 그렇게 엉망이고 추악하게 들립니다.이 상황을 처리하는 가장 좋은 방법은 무엇입니까? A에 대한 기본 생성자를 만들지 않아도됩니다.

미리 감사드립니다.

Mr. WorshipMe

해결책은 다음과 같습니다.

class A {
  int data_ = 0;

public:
    A(const A& other) = delete;
    A& operator=(const A& other) = delete;

    A(int data) : data_(data) {}
    ~A() {}

    A(A&& other) : data_(other.data_) { other.data_ = 0; }
    A& operator=(A&& other) {
        if (this != &other) {
            data_ = other.data_;
            other.data_ = 0;
        }
        return *this;
    }
};

class B {
    A a;

public:
    B(const B& other) = delete;
    B& operator=(const B& other) = delete;

    B(int data) : a(data) {}
    ~B() {}

    B(B&& other) : a(std::move(a)) {  }
    B& operator=(B&& other) {
        if (this != &other) {
            a = std::move(other.a);
        }
        return *this;
    }
};

A에는 int 만 포함되어 있기 때문에 복사본보다 성능이 좋지는 않습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Android의 Kotlin에서 활동 클래스에 대한 기본 생성자를 작성할 수 없습니다.

분류에서Dev

모든 기본 인수가있는 명시 적 생성자는 동일한 클래스의 다른 생성자에서 호출 할 수 없습니다.

분류에서Dev

기본 생성자가없는 가상베이스에서 클래스 파생

분류에서Dev

생성자없이 클래스 내에서 변수 초기화

분류에서Dev

생성자 이동 및 할당 이동. 기본 클래스의 연산자

분류에서Dev

기본 클래스의 기본 소멸자는 멤버가있는 경우 자식 클래스의 이동 생성자를 비활성화합니다.

분류에서Dev

파생 클래스를 선언하는 동안 기본 클래스의 생성자가 호출됩니다.

분류에서Dev

클래스에 대한 기본 생성자가 없습니다.

분류에서Dev

파생 클래스 (생성자에 매개 변수가 있음)와 기본 클래스 (생성자에 매개 변수 없음)간에 실행 가능한 변환이 없습니다.

분류에서Dev

"이 클래스에는 기본 생성자가 있어야합니다."[Android]

분류에서Dev

동일한 클래스의 다른 생성자에서 생성자 변수에 액세스

분류에서Dev

파생 (자식) 클래스에 의한 오버로딩이 가능한 기본 (부모) 클래스 메서드의 클래스 특성에 액세스

분류에서Dev

같은 클래스의 다른 생성자에 기본 생성자 데이터를 사용하는 방법은 무엇입니까?

분류에서Dev

다른 모듈에서 기본 클래스 생성자 호출

분류에서Dev

클래스 내부의 클래스 객체가 기본 생성자없이 자동으로 생성되는 것을 방지하는 방법은 무엇입니까?

분류에서Dev

클래스 내부의 클래스 객체가 기본 생성자없이 자동으로 생성되는 것을 방지하는 방법은 무엇입니까?

분류에서Dev

C ++ : 새 기본 클래스이지만 파생 클래스의 속성에 액세스 할 수 있습니다.

분류에서Dev

Kotlin에서 두 개의 다른 생성자가있는 데이터 클래스 생성자

분류에서Dev

비 생성자 매개 변수 변수를 파생 클래스에서 기본 클래스 생성자로 전달하면 이상한 동작이 발생합니다.

분류에서Dev

비 생성자 매개 변수 변수를 파생 클래스에서 기본 클래스 생성자로 전달하면 이상한 동작이 발생합니다.

분류에서Dev

파생 클래스의 const 값을 기본 예기치 않은 동작의 생성자에 전달하는 C ++

분류에서Dev

C ++ 한 클래스를 다른 클래스의 생성자로 전달할 때 기본 생성자 오류 없음

분류에서Dev

이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

분류에서Dev

이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

분류에서Dev

이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

분류에서Dev

클래스 생성자에서 Winjs 비동기 호출

분류에서Dev

확장 클래스의 생성자 내에서 구독이 제대로 작동하지 않습니다.

분류에서Dev

클래스 다이어그램에서 코드 자동 생성 중지

분류에서Dev

기본 클래스 참조로 파생 클래스 메서드를 호출 할 수 없을 때 동적 다형성이 어떻게 유용한가요?

Related 관련 기사

  1. 1

    Android의 Kotlin에서 활동 클래스에 대한 기본 생성자를 작성할 수 없습니다.

  2. 2

    모든 기본 인수가있는 명시 적 생성자는 동일한 클래스의 다른 생성자에서 호출 할 수 없습니다.

  3. 3

    기본 생성자가없는 가상베이스에서 클래스 파생

  4. 4

    생성자없이 클래스 내에서 변수 초기화

  5. 5

    생성자 이동 및 할당 이동. 기본 클래스의 연산자

  6. 6

    기본 클래스의 기본 소멸자는 멤버가있는 경우 자식 클래스의 이동 생성자를 비활성화합니다.

  7. 7

    파생 클래스를 선언하는 동안 기본 클래스의 생성자가 호출됩니다.

  8. 8

    클래스에 대한 기본 생성자가 없습니다.

  9. 9

    파생 클래스 (생성자에 매개 변수가 있음)와 기본 클래스 (생성자에 매개 변수 없음)간에 실행 가능한 변환이 없습니다.

  10. 10

    "이 클래스에는 기본 생성자가 있어야합니다."[Android]

  11. 11

    동일한 클래스의 다른 생성자에서 생성자 변수에 액세스

  12. 12

    파생 (자식) 클래스에 의한 오버로딩이 가능한 기본 (부모) 클래스 메서드의 클래스 특성에 액세스

  13. 13

    같은 클래스의 다른 생성자에 기본 생성자 데이터를 사용하는 방법은 무엇입니까?

  14. 14

    다른 모듈에서 기본 클래스 생성자 호출

  15. 15

    클래스 내부의 클래스 객체가 기본 생성자없이 자동으로 생성되는 것을 방지하는 방법은 무엇입니까?

  16. 16

    클래스 내부의 클래스 객체가 기본 생성자없이 자동으로 생성되는 것을 방지하는 방법은 무엇입니까?

  17. 17

    C ++ : 새 기본 클래스이지만 파생 클래스의 속성에 액세스 할 수 있습니다.

  18. 18

    Kotlin에서 두 개의 다른 생성자가있는 데이터 클래스 생성자

  19. 19

    비 생성자 매개 변수 변수를 파생 클래스에서 기본 클래스 생성자로 전달하면 이상한 동작이 발생합니다.

  20. 20

    비 생성자 매개 변수 변수를 파생 클래스에서 기본 클래스 생성자로 전달하면 이상한 동작이 발생합니다.

  21. 21

    파생 클래스의 const 값을 기본 예기치 않은 동작의 생성자에 전달하는 C ++

  22. 22

    C ++ 한 클래스를 다른 클래스의 생성자로 전달할 때 기본 생성자 오류 없음

  23. 23

    이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

  24. 24

    이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

  25. 25

    이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

  26. 26

    클래스 생성자에서 Winjs 비동기 호출

  27. 27

    확장 클래스의 생성자 내에서 구독이 제대로 작동하지 않습니다.

  28. 28

    클래스 다이어그램에서 코드 자동 생성 중지

  29. 29

    기본 클래스 참조로 파생 클래스 메서드를 호출 할 수 없을 때 동적 다형성이 어떻게 유용한가요?

뜨겁다태그

보관