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

엔진과 클라이언트 프로젝트를 분리하고 엔진에서 라이브러리를 뽑아서 사용할 때, 업데이트를 배치파일로 만들었다 하더라도 매번 실행하는 번거로움이 발생했다.

 

그래서 엔진 프로젝트 빌드 후 이벤트로 배치파일 자동 실행으로 해결.

 

C++17 이후부터 등장한 타입이다.

 

c_str 메소드가 없는것을 빼면 std::string과 인터페이스가 동일하다. 오히려 문자열을 축소시킬 수 있도록 remove_prefix, remove_suffix 메소드가 추가로 제공된다.

 

string_view는 매개변수로 전달 시 const string&과 달리 오버헤드가 없다. 정확히는 없다기 보다 값으로 전달하지만 스트링에 대한 포인터와 길이만 갖고 있기 때문에 오버헤드가 매우 적다.

그러니 읽기 전용 스트링을 함수의 매개변수로 받는 경우에는 const string&, const char* 대신 string_view를 사용하도록 하자.

 

string str = "Hello";
string_view sv = " world";
auto result = str + sv; // compile error

 

둘을 결합시키고 싶다면 data 메소드를 사용하면 된다.

 

string 리터럴을 string_literals::s를 통해 만들 수 있는 것처럼 string_view 리터럴도 string_view_literals::sv를 통해 만들 수 있다.

// C++17 이전
// 복제 리스트 초기화
auto a = {11}; // initializer_list<int>
auto b = {11, 22}; // initializer_list<int>

// 직접 리스트 초기화
auto c {11}; // initializer_list<int>
auto d {11, 22}; // initializer_list<int>


// C++17 이후
// 복제 리스트 초기화
auto a = {11}; // initializer_list<int>
auto b = {11, 22}; // initializer_list<int>

// 직접 리스트 초기화
auto c {11}; // int
auto d {11, 22}; // compile error

 

C++17 이후로 auto 타입 추론과 관련하여 복제 리스트 초기화와 직접 리스트 초기화가 달라졌다.

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

라이브러리 업데이트 자동 적용  (0) 2023.05.16
string_view  (0) 2023.03.08
[algorithm] sort, stable_sort  (0) 2022.08.03
[algorithm] find, find_if  (0) 2022.08.03
[algorithm] 순열과 조합  (0) 2022.07.31

stable_sort는 크기가 같은 원소끼리는 순서를 교환하지 않고 그대로 유지하는걸 보장한다.

sort는 크기가 같은 원소끼리의 순서가 보장되지 않는다.

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

string_view  (0) 2023.03.08
이니셜라이저 리스트 직접 초기화, 복제 리스트 초기화  (0) 2023.03.08
[algorithm] find, find_if  (0) 2022.08.03
[algorithm] 순열과 조합  (0) 2022.07.31
[algorithm] 교집합, 합집합, 차집합  (0) 2022.07.28

+ Recent posts