// Session.h
class SessionImpl;

class Session
{
public:
    Session() = default;
    ~Session() = default;
    
private:
    std::unique_ptr<SessionImpl> m_pImpl;
};

위와 같이 전방선언한 클래스의 객체를 삭제할 때에는 생성자와 소멸자에 default를 붙여주면 안된다.

조금 더 정확하게는 스마트 포인터 사용 또는 헤더파일에서 원시 포인터를 delete를 하는 경우이다.

 

class Session
{
...
    ~Session() { m_pUserManager.reset(); }
};

왜냐하면 해당 클래스의 원형을 모른채로 소멸자를 호출하는 것과 동일하기 때문이다.

그래서 불완전한 타입을 삭제할 수 없다는 오류가 발생한다.

 

// Session.h
class SessionImpl;

class Session
{
public:
    Session();
    ~Session();
};


// Session.cpp
#include "SessionImpl.h"

Session::Session() {}
Session::~Session() {}

해결법은 간단하다. 기본 생성자와 소멸자를 사용하더라도 default 키워드 대신 cpp에 명시적으로 정의해주면 된다.

주의할 점은 "생성자와 소멸자 둘 다" default 키워드를 사용하면 안된다.

'C++ > 기타' 카테고리의 다른 글

라이브러리 업데이트 자동 적용  (0) 2023.05.16
string_view  (0) 2023.03.08
이니셜라이저 리스트 직접 초기화, 복제 리스트 초기화  (0) 2023.03.08
[algorithm] sort, stable_sort  (0) 2022.08.03
[algorithm] find, find_if  (0) 2022.08.03

+ Recent posts