자원관리 클래스의 자원은 접근 가능하게(effective c++ 15)
형변환을 통한 외부 접근
타입 불일치
- 실수 없이 자원을 관리하기 위해서는 스마트 포인터를 활용하는 방법이 소개되었다.
- 그러나 API 함수를 비롯한 표준 함수들은 원시 포인터(native pointer)를 원한다.
원시 포인터, 스마트 포인터
- 원시 포인터
int* pa;
- 스마트 포인터
std::tr1::shared_ptr<int> ps;
형변환 필요성
- 스마트 포인터는 해당 타입을 감싸고 있는 하나의 객체로 원시 포인터와는 엄연히 다른 타입이다.
- 원시 포인터를 필요로 하는 함수가 있을 경우 이를 형변환해주어야 컴파일 에러를 피할 수 있다.
스마트 포인터
get 함수
- 해당 타입의 원시 포인터 사본을 반환하는 멤버 함수이다.
- auto_ptr과 shared_ptr 모두 사용 가능하다.
- 반환값 : 해당 타입의 원시 포인터
- 시그니쳐 : void
operator->
- 오버로딩을 통해 원시 포인터의 -> 연산자와 같은 기능을 수행한다.
oprator*
- 오버로딩을 통해 원시 포인터의 * 연산자와 같은 기능을 수행한다.
명시적 변환
암시적 변환
매번 get() 함수를 통해 접근하는 것이 번거롭다면 암시적 변환이 가능한 자원 관리 클래스를 만들 수도 있다.
나는 명시적으로 호출 하겠다!
정리
- 실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에,
RAII 클래스를 만들 때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어주어야 한다.
- 자원 접근은 명시전 변환 혹은 암시적 변환을 통해 가능하다. 안정성을 따지면 명시적 변환이 대체적으로 더 낫지만,
고객 편의성을 놓고 보면 암시적 변환이 괜찮다.