>백엔드 개발 >C++ >클래스를 복사할 때 고유 포인터를 처리하는 방법은 무엇입니까?

클래스를 복사할 때 고유 포인터를 처리하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-15 16:00:24700검색

How to Handle Unique Pointers When Copying a Class?

클래스에서 고유 포인터 복사

고유 포인터가 포함된 클래스를 멤버로 복사하려면 특별한 고려가 필요합니다. 고유 포인터는 공유될 수 없으므로 해당 내용의 전체 복사 또는 공유 포인터로의 변환이 필요합니다.

깊은 복사

깊은 복사 접근 방식은 새로운 고유 포인터를 만들고 원래 포인터 내용의 복사본으로 초기화합니다.

class A
{
   std::unique_ptr<int> up_;

public:
   A(int i) : up_(new int(i)) {}
   A(const A& a) : up_(new int(*a.up_)) {}
};

여기서 A의 복사 생성자는 deep은 원래 고유 포인터가 가리키는 int를 복사합니다.

공유 포인터로 변환

또는 고유 포인터를 공유 포인터로 변환할 수 있습니다. 여러 개체 간에 공유됩니다.

class B
{
   std::unique_ptr<int> up_;

public:
   B(int i) : up_(new int(i)) {}
   B(const B& b)
   {
      up_ = std::make_shared(*b.up_);
   }
};

이 예에서 B의 복사 생성자는 고유 포인터를 공유 포인터로 변환합니다. 포인터를 사용하면 B의 여러 복사본이 동일한 기본 데이터에 액세스할 수 있습니다.

기타 연산자

std::Vector와 같은 컨테이너와 원활하게 작동하려면 일반적으로 추가 연산자가 필요합니다. 필수:

  • 이동 생성자:

    B(B&& b)
    {
     up_ = std::move(b.up_);
    }
  • 과제 복사:

    B& operator=(const B& b)
    {
     up_ = std::make_shared(*b.up_);
     return *this;
    }
  • 이동 할당:

    B& operator=(B&& b)
    {
     up_ = std::move(b.up_);
     return *this;
    }

이러한 연산자는 객체가 다양한 컨텍스트에서 안전하게 할당되고 복사될 수 있도록 보장합니다.

위 내용은 클래스를 복사할 때 고유 포인터를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.