Nice programing

unique_ptr로 전달 선언?

nicepro 2020. 12. 5. 10:39
반응형

unique_ptr로 전달 선언?


이 질문에 이미 답변이 있습니다.

std::unique_ptr아래 코드에서 같이 클래스의 포워드 선언을 함께 사용하는 것이 유용하다는 것을 알았습니다 . GCC와 함께 컴파일되고 작동하지만 모든 것이 이상하게 보이며 이것이 표준 동작인지 궁금합니다 (즉, 표준에서 요구하는 것입니까)? 내가 선언 할 때 B는 완전한 유형이 아니기 때문에 unique_ptr.

A.hpp

#include <memory>

class B;

class A {
    std::unique_ptr<B> myptr;
    // B::~B() can't be seen from here
public:
    ~A();
};

A.cpp

#include "B.hpp"
//B.hpp has to be included, otherwise it doesn't work.

A::~A() = default; // without this line, it won't compile 
// however, any destructor definiton will do.

나는 이것이 소멸자와 관련이 있다고 생각합니다 (따라서 소멸자를 호출해야 할 필요성 unique_ptr<B>)은 특정 컴파일 단위 (A.cpp)에 정의되어 있습니다.


명시 적으로 합법적입니다. 규칙은 별도로 지정 하지 않는 한 표준 라이브러리에서 템플릿을 인스턴스화하는 데 사용되는 유형이 완전해야한다는 것 입니다. 의 경우 unique_ptr§20.7.1 / 5에는 "[...] unique_ptr의 템플릿 매개 변수 T가 불완전한 유형일 수 있습니다."라고 말합니다.

완전한 유형을 요구하는 포인터에 대한 특정 작업이 있습니다. 특히, 객체가 실제로 파괴 될 때 (적어도 기본 삭제 자 사용). 예를 들어, A::~A()인라인 이라면 문제가 발생할 수 있습니다. (소멸자를 직접 선언하지 않으면 인라인 상태가됩니다. 이는 부분적으로 사용 목적에 위배됩니다 std::unique_ptr.)

참고 URL : https://stackoverflow.com/questions/13414652/forward-declaration-with-unique-ptr

반응형