// 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 |