책 정리/Effective C++ 3rd
항목 15. 자원 관리 클래스에서 관리되는 자원은 외부에서 접근하도록 하자.
ocean20
2019. 12. 30. 14:10
자원 관리 클래스에서 관리되는 자원은 외부에서 접근가능하도록 하자
이코드를 보자.
std::tr1::shared_ptr<Investment> pInv(createInvestment());
…
//그리고 이함수를 사용한다고 가정해보자.
int daysHeld(const Investment *pi);
//만약 위 함수를 아래코드와 같이사용한다면 에러!
int days = daysHeld(pInv); //ERROR!
에러 사유) daysHeld는 Investment*의 실제포인터를 원하기 때문이다.
결론) RAII의 객체안에 실제자원을 변활해줄 방법이 필요
1. 명시적변환
(1) int days = daysHeld(pInv.get()); //실제포인터를 반환해준다 get함수를 이용해서
2. 암시적변환
(1) 포인터 역참조 연산자(operator-> / operator*)를 오버로딩하여 암시적변환을 수행한다.
즉, 외부에서 자원 접근을 가능하게 한다.
위 명시적변환에서 포인터를 얻고싶을때, get()을 호출해줘야하기 때문에 안이뻐보일 수 있다.
따라서 연산자 오버로딩을 통해
daysHeld(pInv) 그대로 사용가능할 수 도 있다.
하지만, 이와 같은 연산자 오버로딩으로 인해 부작용이 생길가능성이 있다.
이것만은 알아두자!
1. RAII 클래스를 만들때에는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어줘야 한다.
2. 자원 접근은 명시적 변환 혹인 암시적으로 가능하다. 안전성(명시적 > 암시적), 고객편의성(명시적 < 암시적)