> 백엔드 개발 > C++ > C에서 'unique_ptr'을 Base에서 Derived로 안전하게 다운캐스트하는 방법은 무엇입니까?

C에서 'unique_ptr'을 Base에서 Derived로 안전하게 다운캐스트하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-23 11:03:35
원래의
826명이 탐색했습니다.

How to Safely Downcast a `unique_ptr` from Base to Derived in C  ?

unique_ptr을 기본에서 파생으로 다운캐스트하는 방법

객체 지향 프로그래밍에서는 클래스 계층을 사용하여 실제 세계 개념. C에서는 종종 상속을 사용하여 이를 수행합니다. 상속을 통해 파생 클래스는 기본 클래스의 속성과 동작을 상속받을 수 있습니다.

클래스 계층 구조를 사용할 때 일반적으로 필요한 것 중 하나는 기본 클래스에 대한 포인터를 파생 클래스에 대한 포인터로 변환하는 것입니다. 이 프로세스를 다운캐스팅이라고 합니다.

고유 포인터의 맥락에서 다운캐스팅은 약간 까다로울 수 있습니다. 이는 고유 포인터가 매달린 포인터 및 기타 메모리 문제를 방지하도록 설계되었기 때문입니다. 따라서 단순히 static_cast를 사용하여 Unique_ptr을 다른 유형으로 변환할 수는 없습니다.

대신 다음 방법 중 하나를 사용해야 합니다.

1. 정적 고유 포인터 캐스트

이 방법은 고유 포인터에 실제로 파생 클래스에 대한 포인터가 포함되어 있다고 확신할 때 사용할 수 있습니다. 다음 함수 템플릿을 사용하여 정적 고유 포인터 캐스트를 수행할 수 있습니다.

template<typename Derived, typename Base, typename Del>
std::unique_ptr<Derived, Del>
static_unique_ptr_cast(std::unique_ptr<Base, Del> &&p) {
  auto d = static_cast<Derived *>(p.release());
  return std::unique_ptr<Derived, Del>(d, std::move(p.get_deleter()));
}
로그인 후 복사

2. 동적 고유 포인터 캐스트

이 방법은 고유 포인터에 파생 클래스에 대한 포인터가 포함되어 있는지 확실하지 않을 때 사용할 수 있습니다. 다음 함수 템플릿을 사용하여 동적 고유 포인터 캐스팅을 수행할 수 있습니다.

template<typename Derived, typename Base, typename Del>
std::unique_ptr<Derived, Del>
dynamic_unique_ptr_cast(std::unique_ptr<Base, Del> &&p) {
  if (Derived *result = dynamic_cast<Derived *>(p.get())) {
    p.release();
    return std::unique_ptr<Derived, Del>(result, std::move(p.get_deleter()));
  }
  return std::unique_ptr<Derived, Del>(nullptr, p.get_deleter());
}
로그인 후 복사

다음 코드는 정적 고유 포인터 캐스팅을 사용하는 방법을 보여줍니다. Unique_ptr을 다른 유형으로 변환:

#include <memory>

class Base {
public:
  virtual ~Base() {}
};

class Derived : public Base {
public:
  ~Derived() {}
};

int main() {
  std::unique_ptr<Base> uptr = std::make_unique<Derived>();
  std::unique_ptr<Derived> dptr = static_unique_ptr_cast<Derived>(std::move(uptr));
  return 0;
}
로그인 후 복사

이 예에서는 Unique_ptr을 Base로 생성합니다. 물체. 그런 다음 정적 고유 포인터 캐스트를 사용하여 고유_ptr을 고유_ptr, 파생 개체로 변환합니다. 이는 기본 개체에 대한 고유_ptr에 실제로 파생 개체에 대한 포인터가 포함되어 있다는 것을 알고 있기 때문에 가능합니다.

위 내용은 C에서 'unique_ptr'을 Base에서 Derived로 안전하게 다운캐스트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿